社区讨论
蒟蒻求助QAQ反悔贪心
P3620[APIO/CTSC2007] 数据备份参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo8ipvp5
- 此快照首次捕获于
- 2023/10/27 19:16 2 年前
- 此快照最后确认于
- 2023/10/27 19:16 2 年前
,我的思路大致就是把差分的数值作为链接的花费,然后其他的贪心策略以及代码的实现基本与种树那道题类似
但在处理坐标时,一直出问题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 条回复,欢迎继续交流。
正在加载回复...