社区讨论

蒟蒻求助QAQ反悔贪心

P3620[APIO/CTSC2007] 数据备份参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo8ipvp5
此快照首次捕获于
2023/10/27 19:16
2 年前
此快照最后确认于
2023/10/27 19:16
2 年前
查看原帖
RTRT,我的思路大致就是把差分的数值作为链接的花费,然后其他的贪心策略以及代码的实现基本与种树那道题类似
但在处理坐标时,一直出问题QAQ
求大佬斧正QAQ
code:
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,ans,tot,pre;
int l[200200],r[200200],w[200200],num[200200],vis[200200];
struct node{
	int id,w;
	friend bool operator<(node a,node b)
	{
		return a.w>b.w;
	}
}cur,nxt;
priority_queue<node>q;
signed main()
{
	scanf("%lld%lld%lld",&n,&k,&pre);
	for(int i=1;i<n;++i)
	{
		scanf("%lld",&num[i]);
		w[i]=num[i]-pre;
		pre=num[i];
	}
	for(int i=1;i<n;++i)
	{
		++tot;
		if(i==1)
		{
			l[i]=-1;
			r[i]=i+1;
		}
		else if(i==n-1)
		{
			l[i]=i-1;
			r[i]=-1;
		}
		else 
		{
			l[i]=i-1;
			r[i]=i+1;
		}
		cur.id=tot;
		cur.w=w[i];
		q.push(cur);
	}
	for(int i=1;i<=k;++i)
	{
		while(vis[q.top().id])q.pop();
		ans+=q.top().w;
		int cid=q.top().id,cw=q.top().w;
		q.pop();
		++tot;
		vis[l[cid]]=1;vis[r[cid]]=1;
		l[r[r[cid]]]=tot;r[l[l[cid]]]=tot;
		l[tot]=l[l[cid]];r[tot]=r[r[cid]];
		w[tot]=w[l[cid]]+w[r[cid]]-cw;
		nxt.id=tot;
		nxt.w=w[tot];
		q.push(nxt);
	}
	printf("%lld",ans);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...