社区讨论
求助双倍经验崩了
SP1553 BACKUP - Backup Files参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo7x3rbf
- 此快照首次捕获于
- 2023/10/27 09:11 2 年前
- 此快照最后确认于
- 2023/10/27 09:11 2 年前
这份代码在不加多次测试时在,为什么加了多测清空后?
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
int t;
#define debug puts("fuck")
const int maxn=5e5+10;
struct node{
int pre,nxt,val;//双向链表维护
}a[maxn];
struct nOdE{
int val,idx;
bool operator<(const nOdE &o)const {
return val>o.val;
}
};
priority_queue<nOdE> q;
int n,k,now,last,ans;
bool vis[maxn];
inline void change(int x)//去pre[x],nxt[x],x,加上pre[x]+nxt[x]-x
{
a[x].pre=a[a[x].pre].pre;
a[x].nxt=a[a[x].nxt].nxt;
a[a[x].pre].nxt=x;
a[a[x].nxt].pre=x;
}
signed main()
{
scanf("%lld",&t);
while(t--)
{
ans=0;
memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();//清空
scanf("%lld%lld",&n,&k);
scanf("%lld",&last);
memset(a,0,sizeof(a));
for(int i=2;i<=n;i++)
{
scanf("%lld",&now);
a[i].val=now-last;//加入
last=now;
a[i].pre=i-1;
a[i].nxt=i+1;
q.push((nOdE){a[i].val,i});//加入
}
a[0].val=a[n].val=LONG_MAX;//注意越界
for(int i=1;i<=k;i++)
{
while(vis[q.top().idx])q.pop();//排除
nOdE cur=q.top();
q.pop();
ans+=cur.val;
vis[a[cur.idx].pre]=1;vis[a[cur.idx].nxt]=1;//左右排除
a[cur.idx].val=a[a[cur.idx].pre].val+a[a[cur.idx].nxt].val-a[cur.idx].val;//更新权值
q.push((nOdE){a[cur.idx].val,cur.idx});
change(cur.idx);
}
printf("%lld\n",ans);
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...