对于那个更新左右的操作,我将题解的那部分复制上去好像也没过......
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100001;
int n,k;
ll ans;
ll d[N],l[N],r[N];
typedef pair<ll,int> pi;
priority_queue<pi,vector<pi>,greater<pi> > q;
bool rm[N];
int main()
{
cin>>n>>k;
int ii=0,temp=0;
cin>>temp;
int s;
while(cin>>s)
{
d[++ii]=s-temp;
temp=s;
}
d[0]=d[n]=0;
//for(int i=1;i<=n-1;i++) cout<<d[i]<<" ";
//cout<<endl;
for(int i=1;i<=n-1;i++)
{
q.push({d[i],i});
l[i]=i-1;//d[i-1];
r[i]=i+1;//d[i+1];
}
for(int i=1;i<=k;i++)
{
while(rm[q.top().second]) q.pop();
auto t=q.top();
ll di=t.first;
int p=t.second;
ans+=di;
q.pop();
rm[l[p]]=1;rm[r[p]]=1;
d[p]=d[l[p]]+d[r[p]]-di;
r[p]=r[r[p]];
l[p]=l[l[p]];
l[r[p]]=r[l[p]]=p;
//r[l[l[p]]]=r[r[p]];
//l[r[r[p]]]=l[l[p]];
//if(l[p]>=1) l[p]//-=1;
//else l[p]=0;
// r[p]+=1;
//l[p]=l[p-1];r[p]=r[p+1];
q.push({/*-di+l[p]+r[p]*/d[p],p});
}
cout<<ans;
return 0;
}