a b c 相邻
b>a,b>c
删除a,b,c
添加a+c-b
相当于删除a,c,改b权值
priority_queue不支持以上删除操作
打标记
#include <bits/stdc++.h>
#define val first
#define id second
using namespace std;
typedef long long ll;
typedef pair<int ,int>P;
const int INF = 0x3f3f3f3f;
const int maxn = 2e5+9;
int a[maxn];
int l[maxn],r[maxn];
int vis[maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=2;i<n;i++){
l[i]=i-1;
r[i]=i+1;
}
l[1]=n; r[1]=2;
l[n]=n-1; r[n]=1;
priority_queue<P>que;
for(int i=1;i<=n;i++){
que.push(P(a[i],i));
}
int ans=0;
int cnt=0;
for(int i=1;i<=m;i++){
if(que.empty())break;
P tmp=que.top(); que.pop();
while(!que.empty()&&vis[tmp.id]){
tmp=que.top(); que.pop();
}
if(vis[tmp.id])break;
++cnt;
ans+=tmp.val;
// cout<<ans<<endl;
if(l[l[tmp.id]]==r[tmp.id]||r[r[tmp.id]]==l[tmp.id]||l[tmp.id]==r[tmp.id])break;
int le=l[tmp.id];
int ri=r[tmp.id];
if(l[le]==ri||r[ri]==le||ri==le)break;
vis[le]=vis[ri]=1;
l[tmp.id]=l[le];
r[tmp.id]=r[ri];
r[l[le]]=tmp.id;
l[r[ri]]=tmp.id;
tmp.val=a[tmp.id]=a[le]+a[ri]-tmp.val;
// cout<<"***"<<tmp.val<<endl;
que.push(tmp);
// vis[l[tmp.id]]=vis[r[tmp.id]]=1;
// r[l[l[tmp.id]]]=tmp.id; l[r[r[tmp.id]]]=tmp.id;
// tmp.val=a[tmp.id]=a[l[tmp.id]]+a[r[tmp.id]]-a[tmp.id];
cout<<"***"<<tmp.val<<endl;
// l[tmp.id]=l[l[tmp.id]];
// r[tmp.id]=r[r[tmp.id]];
// que.push(tmp);
}
if(cnt==m)printf("%d\n",ans);
else printf("Error!\n");
return 0;
}