您的位置:首页 > 其它

【codevs 1615】数据备份

2017-11-05 21:05 141 查看
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
struct zt
{
int ct;//区间的序号
ll l;//区间内选择的长度
};
bool operator <(zt a,zt b)
{
return a.l>b.l;
}
priority_queue<zt>q;
const int maxn=1000000+5;
int nxt[maxn],pre[maxn],a[maxn],cnt,tmpre,tmnxt,n,k,tot;
ll len[maxn],ans;
bool del[maxn];
int main()
{
memset(del,0,sizeof(del));
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
for(int i=1;i<n;i++)
{
len[i]=a[i+1]-a[i];
pre[i]=i-1;
nxt[i]=i+1;
q.push((zt){i,len[i]});
}
cnt=n-1;
len[0]=len
=1e12;
cnt++;
while(!q.empty())
{
zt u=q.top();
q.pop();
if(!del[u.ct])//可以选
{
tot++;//区间数
ans+=u.l;
if(tot==k)
{
printf("%lld",ans);
return 0;
}
tmpre=pre[u.ct],tmnxt=nxt[u.ct];
u.l=-u.l+len[tmpre]+len[tmnxt];//当前区间内的答案
nxt[pre[tmpre]]=++cnt;
nxt[cnt]=nxt[tmnxt];
pre[nxt[tmnxt]]=cnt;
pre[cnt]=pre[tmpre];
len[cnt]=u.l;//当前区间内的答案
del[tmpre]=del[tmnxt]=del[u.ct]=1
4000
;//不可以选
u.ct=cnt;
q.push(u);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: