UKE咋办
查看原帖
UKE咋办
886055
MoonCake2011楼主2023/6/29 17:47
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int a[500010],l[500010],r[500010];
struct node{
	int x;
	int p;
};
bool operator < (node x,node y){
	return x.x>y.x;
}
priority_queue<node>q;
bool vis[500010];
int ans;
void erase(int x){
	l[r[x]]=l[x];
	r[l[x]]=r[x];
	vis[x]=1;
}
void solve() {
	memset(l,0,sizeof l);
	memset(r,0,sizeof r);
	memset(vis,0,sizeof vis);
	ans=0;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<n;i++){
		a[i]=a[i+1]-a[i],l[i]=i-1;
		if(i!=n-1) r[i]=i+1;
	}
	for(int i=1;i<n;i++)
		q.push((node){a[i],i});
	a[0]=1e18;
	for(int i=1;i<=k;i++){
		while(vis[q.top().p]) q.pop();
		node t=q.top();
		int x=t.x,p=t.p;
		q.pop();
		ans+=x;
		a[p]=a[l[p]]+a[r[p]]-a[p];
		vis[p]=0;
		erase(l[p]),erase(r[p]);
		q.push((node){a[p],p});
	}
	priority_queue<node>tmp;
	swap(tmp,q);
	cout<<ans<<"\n";
	return;
}
signed main() {
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
}
``
2023/6/29 17:47
加载中...