#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,k=1;
char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*k;
}
struct node
{
int l,r,val;
}e[100005];
struct node1
{
int val,index;
bool operator <(const node1 &x)const{return x.val<val;}
};
int a[100005];
bool vis[100005];
priority_queue<node1>q;
inline void del(int x)
{
e[x].l=e[e[x].l].l;e[x].r=e[e[x].r].r;
e[e[x].l].r=x;e[e[x].r].l=x;
}
int main()
{
int n=read(),k=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<n;++i)
{
e[i].l=i-1;e[i].r=i+1;
e[i].val=a[i+1]-a[i];
q.push((node1){e[i].val,i});
}
e[0].val=e[n].val=1e9;
int ans=0;
while(k--)
{
while(vis[q.top().index])q.pop();
node1 t=q.top();q.pop();
int po=t.index;
ans+=t.val;
vis[e[po].l]=vis[e[po].r]=true;
e[po].val=e[e[po].l].val+e[e[po].r].val-e[po].val;
q.push((node1){e[po].val,po});
del(po);
}
printf("%d",ans);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,k=1;
char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*k;
}
struct node
{
int l,r,val;
}e[100005];
struct node1
{
int val,index;
bool operator <(const node1 &x)const{return x.val<val;}
};
int a[100005];
bool vis[100005];
priority_queue<node1>q;
inline void del(int x)
{
e[x].l=e[e[x].l].l;e[x].r=e[e[x].r].r;
e[e[x].l].r=x;e[e[x].r].l=x;
vis[e[x].l]=vis[e[x].r]=true;
}
int main()
{
int n=read(),k=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<n;++i)
{
e[i].l=i-1;e[i].r=i+1;
e[i].val=a[i+1]-a[i];
q.push((node1){e[i].val,i});
}
e[0].val=e[n].val=1e9;
int ans=0;
while(k--)
{
while(vis[q.top().index])q.pop();
node1 t=q.top();q.pop();
int po=t.index,pi=t.val;
ans+=pi;
e[po].val=e[e[po].l].val+e[e[po].r].val-e[po].val;
q.push((node1){e[po].val,po});
del(po);
}
printf("%d",ans);
return 0;
}
P3620,下面那份代码过不了样例,上面却可以,感觉含义差不多。。。