5pts求助
查看原帖
5pts求助
561949
syr1125楼主2023/9/29 16:43
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 200005; 

struct place
{
	int val, l, r;
}p[N];

struct node
{
	int val, id;
	bool operator > (node t) const
	{
		return val > t.val;
	} 
};

int n, m, ans;
int vis[N], a[N];
priority_queue<node, vector<node>, greater<node>> q;

signed main()
{
	scanf("%lld %lld", &n, &m);
	for(int i = 1; i <= n; i ++)
	{
		scanf("%lld", &a[i]);
	}
	
	for (int i = 2; i <= n; i ++)
	{
		p[i - 1].l = i - 2;
		p[i - 1].r = i;
		q.push({a[i] - a[i - 1], i - 1});
	}
	
	p[0].val = p[n].val = 0x3f3f3f3f;
	for (int i = 1; i <= m; i ++)
	{
		while (vis[q.top().id])
		{
			q.pop();
		}
		
		auto now = q.top();
		q.pop();
		ans += now.val;
		vis[p[now.id].l] = vis[p[now.id].r] = 1;
		p[now.id].val = p[p[now.id].l].val + p[p[now.id].r].val - p[now.id].val;
		q.push({p[now.id].val, now.id});
		p[now.id].l = p[p[now.id].l].l;
		p[now.id].r = p[p[now.id].r].r;
		p[p[now.id].l].r = now.id;
		p[p[now.id].r].l = now.id;
	}
	printf("%lld", ans);
	return 0;
}

rt,样例没过

2023/9/29 16:43
加载中...