求助
查看原帖
求助
104963
Gary88楼主2020/9/18 17:47
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int n,k,a[500001],d[500001],ans,vis[500001],l[500001],r[500001];
struct node
{
	int v,no;
	bool operator < (const node& x) const
	{
		return v>x.v;
	}
};
priority_queue<node> q;
int main()
{
	scanf("%d%d",&n,&k);
	scanf("%d",&a[0]);
	for(int i=1;i<n;i++)
	{
		scanf("%d",&a[i]);
		d[i]=a[i]-a[i-1];
		l[i]=i-1;
		r[i]=i+1;
		q.push((node){d[i],i});
	}
	d[0]=d[n]=1000000010;
	for(int i=1;i<=k;i++)
	{
		while(vis[q.top().no]);
		q.pop();
		node u=q.top();
		q.pop();
		ans+=u.v;
		vis[l[u.no]]=vis[r[u.no]]=1;
		d[u.no]=d[l[u.no]]+d[r[u.no]]-d[u.no];
		q.push((node){d[u.no],u.no});
		l[u.no]=l[l[u.no]];
		r[u.no]=r[r[u.no]];
		r[l[u.no]]=l[r[u.no]]=u.no;
	}
	printf("%d",ans);
	return 0;
}
2020/9/18 17:47
加载中...