91pts 对顶堆求调
查看原帖
91pts 对顶堆求调
643818
I_AK_CTS楼主2025/6/23 10:43
#include<bits/stdc++.h>
#define int long long 
using namespace std; 
const int N=1e5+5;
int k,n,a[N],b[N],cnt,ans,sum1,sum2,pre[N],suf[N],id[N],mn=1e18;
priority_queue<int> q1,q2;
void ins(int x)
{
	if(q1.empty())
	{
		sum1+=x,q1.push(x);
		return;
	}
	q1.push(x),sum1+=x;
	if((!q2.empty()&&q1.top()>-q2.top())||q1.size()>=q2.size()+2)
	{
		q2.push(-q1.top()),sum2+=q1.top();
		sum1-=q1.top(),q1.pop();
	}
	if(q2.size()>q1.size())
	{
		q1.push(-q2.top()),sum2-=-q2.top();
		sum1+=-q2.top(),q2.pop();
	}
}
signed main()
{
	cin>>k>>n;
	for(int i=1;i<=n;i++)
	{
		char c1,c2;
		int x,y;
		cin>>c1>>x>>c2>>y;
		if(c1==c2) ans+=abs(y-x);
		else
		{
			if(c1=='B'&&c2=='A') swap(x,y);
			a[++cnt]=x,b[cnt]=y,ans++;
		}
	}
	if(k==1)
	{
		for(int i=1;i<=cnt;i++)
			ins(a[i]),ins(b[i]);
		cout<<sum2-sum1+ans;
	}
	else
	{
		for(int i=1;i<=cnt;i++) id[i]=i;
		sort(id+1,id+1+cnt,[&](int x,int y)
		{
			return a[x]+b[x]<a[y]+b[y];
		});
		for(int i=1;i<=cnt;i++)
		{
			ins(a[id[i]]),ins(b[id[i]]);
			pre[i]=sum2-sum1;
		}
		sum1=sum2=0;
		q1=priority_queue<int>();
		q2=priority_queue<int>();
		for(int i=cnt;i;i--)
		{
			ins(a[id[i]]),ins(b[id[i]]);
			suf[i]=sum2-sum1;
		}
		for(int i=1;i<cnt;i++) mn=min(mn,pre[i]+suf[i+1]);
		cout<<mn+ans;
	}
	return 0;
}
2025/6/23 10:43
加载中...