反悔贪心 40pts 求调,玄关
查看原帖
反悔贪心 40pts 求调,玄关
1105993
Misserina楼主2024/11/29 16:50
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t,arr[100005],pos=0,fs[50005];
int a2[100005],lt[100005],rt[100005];
bool marked[100005];
struct node {
	int id;
	int val;
	bool operator <(const node &x) const {
		return val>x.val;
	}
};
priority_queue<node> q;
signed main() {
	scanf("%lld%lld",&n,&m);
	if (m==0) {
		printf("0");
		return m;
	}
	for (int i=1;i<=n;i++) {
		scanf("%lld",&t);
		if (pos%2==1 && t>0 || pos%2==0 && t<0) arr[pos]+=t;
		else arr[++pos]=t;
	}
	int res=0;
	for (int i=1;i<=pos;i+=2) res+=arr[i];
	for (int i=1;i<=pos;i++) {
		a2[i]=arr[i];
		if (a2[i]<0) a2[i]=-a2[i];
		lt[i]=i-1;
		rt[i]=i+1;
		node N;
		N.id=i;
		N.val=a2[i];
		q.push(N);
	}
	while (m<(pos+1)/2) {
		node N=q.top();
		q.pop();
		if (marked[N.id] || a2[N.id]!=N.val) continue;
		res-=N.val;
		m++;
		marked[lt[N.id]]=1;
		marked[rt[N.id]]=1;
		a2[N.id]=a2[lt[N.id]]+a2[rt[N.id]]-a2[N.id];
		node New;
		New.id=N.id;
		New.val=a2[N.id];
		q.push(New);
		lt[N.id]=lt[lt[N.id]];
		rt[N.id]=rt[rt[N.id]];
		lt[rt[N.id]]=N.id;
		rt[lt[N.id]]=N.id;
	}
	printf("%lld",res);
}
2024/11/29 16:50
加载中...