#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
long long r[100001];
long long l[100001];
long long n,m;
long long pos[100001];
long long key[100001];
bool exist[100001];
struct node
{
long long zhi;
long long dian;
bool operator <(const node &t)const
{
return zhi>t.zhi;
}
};
node a[100001];
priority_queue <node> q;
long long read()
{
long long k=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
while(c>='0'&&c<='9') {k=k*10+(c-'0'); c=getchar();}
return k*f;
}
int main()
{
freopen("lx.in","r",stdin);
freopen("lx.out","w",stdout);
n=read();
m=read();
long long i,j,k;
pos[1]=read();
for(i=2;i<=n;i++)
{
pos[i]=read();
key[i-1]=pos[i]-pos[i-1];
}
for(i=1;i<=n-1;i++)
{
l[i]=i-1;
r[i]=i+1;
}
r[n-1]=0;
l[1]=0;
key[0]=100000000000000LL;
node t;
for(i=1;i<n;i++)
{
t.zhi=key[i];
t.dian=i;
q.push(t);
}
long long sum=0;
long long s;
for(i=1;i<=m;i++)
{
while(exist[q.top().dian]) q.pop();
t=q.top();
q.pop();
s=t.dian;
sum+=t.zhi;
exist[l[s]]=1;
exist[r[s]]=1;
key[s]=key[l[s]]+key[r[s]]-t.zhi;
l[s]=l[l[s]];
r[l[s]]=s;
r[s]=r[r[s]];
l[r[s]]=s;
t.zhi=key[s];
q.push(t);
}
cout<<sum;
return 0;
}
BZOJ1150 数据备份
最新推荐文章于 2019-12-02 11:52:47 发布