细节好多
优先队列+贪心
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
struct data{
int l,r,v,ni,w;
bool operator <(const data &m)const{
return v>m.v;
}
}d[200005],op,kp;
int n,k;
priority_queue<data>Q;
int tot;
long long ans=0;
int e[200005];
int a[100005];
int main()
{
int i,j,l,r;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
d[0].v=0x3f3f3f3f;
d[0].l=d[0].r=d[0].w=0;
for(i=1;i<n;i++){
d[i].v=a[i+1]-a[i];
d[i].l=i-1;
if(i!=n-1)d[i].r=i+1;
d[i].ni=i;
d[i].w=1;
Q.push(d[i]);
}
tot=n-1;
while(k){
op=Q.top();
Q.pop();
if(e[op.ni]==0){
l=d[op.ni].l;
r=d[op.ni].r;
ans+=d[op.ni].v;
e[op.ni]=e[l]=e[r]=1;
k-=d[op.ni].w;
tot++;
d[tot].ni=tot;
d[tot].v=d[l].v+d[r].v-d[op.ni].v;
d[tot].l=d[l].l;
d[tot].r=d[r].r;
d[tot].w=d[l].w+d[r].w-d[op.ni].w;
d[d[l].l].r=tot;
d[d[r].r].l=tot;
Q.push(d[tot]);
}
}
printf("%lld",ans);
return 0;
}