那么请再检查一下你的初始化。
WA 45pts code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,k,tot;
long long ans,d[maxn];
bool exist[maxn];
struct node{
int l,r;
long long d;
}rcd[maxn];
inline void del(int pos){
rcd[rcd[pos].l].r=rcd[pos].r;
rcd[rcd[pos].r].l=rcd[pos].l;
return;
}
struct referer{
long long d;
int p;
};
inline bool operator<(referer x,referer y){
if(x.d!=y.d) return x.d>y.d;
else return x.p>y.p;
}
priority_queue<referer>q;
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%lld",d+i);
for(int i=n-1;i>=1;i--) d[i]-=d[i-1];
for(int i=1;i<n;i++){
rcd[++tot]=(node){i-1,i+1,d[i]};
// exist[tot]=true;
q.push((referer){d[i],i});
}
while(k--){
while(exist[q.top().p]) q.pop();
referer p=q.top();q.pop();
ans+=rcd[p.p].d;
rcd[p.p].d=rcd[rcd[p.p].l].d+
rcd[rcd[p.p].r].d-rcd[p.p].d;
q.push((referer){rcd[p.p].d,p.p});
exist[rcd[p.p].l]=exist[rcd[p.p].r]=true;
// del(rcd[p.p].l);
// del(rcd[p.p].r);
rcd[p.p].l=rcd[rcd[p.p].l].l;
rcd[p.p].r=rcd[rcd[p.p].r].r;
rcd[rcd[p.p].l].r=p.p;
rcd[rcd[p.p].r].l=p.p;
}
printf("%lld",ans);
return 0;
}
调了好久愣是死活调不出来
直到我把 rcd[0] 初始化……
AC code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,k;
long long ans,d[maxn];
bool exist[maxn];
struct node{
int l,r;
long long d;
}rcd[maxn];
struct referer{
long long d;
int p;
};
inline bool operator<(referer x,referer y){
if(x.d!=y.d) return x.d>y.d;
else return x.p>y.p;
}
priority_queue<referer>q;
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%lld",d+i);
for(int i=n-1;i>=1;i--){
d[i]-=d[i-1];
// cout<<d[i]<<endl;
}
d[0]=d[n]=LONG_LONG_MAX;
// exist[0]=exist[n]=true;
for(int i=1;i<n;i++){
rcd[i]=(node){i-1,(i+1)%n,d[i]};
// exist[tot]=true;
q.push((referer){d[i],i});
}
rcd[0].d=rcd[n].d=1e16;
while(k--){
while(exist[q.top().p]) q.pop();
referer p=q.top();q.pop();
ans+=rcd[p.p].d;
rcd[p.p].d=rcd[rcd[p.p].l].d+
rcd[rcd[p.p].r].d-rcd[p.p].d;
q.push((referer){rcd[p.p].d,p.p});
exist[rcd[p.p].l]=exist[rcd[p.p].r]=true;
// del(rcd[p.p].l);
// del(rcd[p.p].r);
rcd[p.p].l=rcd[rcd[p.p].l].l;
rcd[p.p].r=rcd[rcd[p.p].r].r;
rcd[rcd[p.p].l].r=p.p;
rcd[rcd[p.p].r].l=p.p;
// cout<<ans<<endl;
}
printf("%lld",ans);
return 0;
}