WA70pts MnZn求助
查看原帖
WA70pts MnZn求助
227728
冰糖鸽子TJ鸽子协会楼主2021/4/9 14:07

RT,简单反悔贪心

#include <bits/stdc++.h>
using namespace std;
#define M 1000010
#define int long long
int n,m,cnt,ans,x,y,cntp;
int a[M];
struct node
{
	int l,r,v;
}t[M];
struct cmp
{
	bool operator()(int XX,int YY)
	{
		return (t[XX].v==t[YY].v?XX<YY:t[XX].v>t[YY].v);
	}
};
priority_queue<int,vector<int>,cmp>q,qd;
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		y=x;
		cin>>x;
		a[i-1]=x-y;
	}
	n--;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		t[i].l=i-1;
		t[i].r=(i+1)%(n+1);
		t[i].v=a[i];
		q.push(i);
	}
	cntp=n;
	while(cnt<m)
	{
		while(!qd.empty()&&q.top()==qd.top())
		{
			q.pop();qd.pop();
		}
		cnt++;x=q.top();q.pop();
		if(t[x].l) qd.push(t[x].l);
		if(t[x].r) qd.push(t[x].r);
		ans+=t[x].v;
		y=(t[t[x].l].v+t[t[x].r].v)-t[x].v;
		if(t[x].r&&t[x].l)
		{
			++cntp;
			t[t[t[x].l].l].r=cntp; t[0].r=0;
			t[t[t[x].r].r].l=cntp; t[0].l=0;
			t[cntp].l=t[t[x].l].l;
			t[cntp].r=t[t[x].r].r;
			t[cntp].v=y;q.push(cntp);
		}
		else
		{
			if(!t[x].r) t[t[x].l].r=0;
			if(!t[x].l) t[t[x].r].l=0;
		}
	}
	cout<<ans<<endl;
	return 0;
}
2021/4/9 14:07
加载中...