反悔贪心95pts求调,#18比答案多1
查看原帖
反悔贪心95pts求调,#18比答案多1
642544
makerY楼主2023/11/7 15:52

rt,调了很久,不知道问题在哪。

记录

改了一下循环链表,直接交到P1484 种树都能A。

思路同第一篇题解。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=300010;
int n,m,a[N];
struct Link
{
	int l,r,val;
	bool d=0;
}link[N];
inline void del(int x)
{
	link[link[x].l].r=link[x].r;
	link[link[x].r].l=link[x].l;
	link[x].r=link[x].l=link[x].val=-1;
	link[x].d=true;//标记删除
}
priority_queue<pair<int,int> > q;
long long ans;
int main()
{
	scanf("%d%d",&n,&m);
	if(n<m*2)
	{
		printf("Error!");
		return 0;
	}
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),q.push(make_pair(a[i],i)),link[i].val=a[i],link[i].l=i-1,link[i].r=i+1;
	link[1].l=n,link[n].r=1;
	int cnt=0,idx=n;
	while(!q.empty()&&q.top().first&&cnt<m)
	{
		while(!q.empty()&&link[q.top().second].d) q.pop();//弹出已经被删掉的
		if(q.empty()) break;
		auto u=q.top();q.pop();
		if(u.second<=0) break;
		ans+=u.first;
		link[u.second].val=link[link[u.second].l].val+link[link[u.second].r].val-link[u.second].val;
		q.push(make_pair(link[u.second].val,u.second));
		del(link[u.second].l),del(link[u.second].r);
		++cnt;
	}
	printf("%lld",ans);
	return 0;
}
2023/11/7 15:52
加载中...