比赛 EYOI常规赛 7th 评测结果 AAAAAAAAAA
题目名称 生日礼物 最终得分 100
用户昵称 ムラサメ 运行时间 0.205 s
代码语言 C++ 内存使用 2.15 MiB
提交时间 2023-03-10 09:19:34
显示代码纯文本
#include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
#define inf 10000007
#define N 100007
using namespace std;
struct cmp{
	bool operator()(pa a,pa b){
		return abs(a.first)>abs(b.first);
	}
};
priority_queue<pa,vector<pa>,cmp>q;
int n,m,tot,ans,sum;
int a[N],nxt[N],pre[N];
bool mark[N];
void del(int x){
	mark[x]=1;
	pre[nxt[x]]=pre[x];
	nxt[pre[x]]=nxt[x];
}
int main(){
	freopen("present.in","r",stdin);
    freopen("present.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin>>n>>m;
	tot=1;
	for (int i=1;i<=n;i++){
		int x;
		cin>>x;
		if((ll)a[tot]*x>=0){
			a[tot]+=x;
		}
		else{
			a[++tot]=x;
		}
	}
	n=tot;
	for(int i=1;i<=n;i++){
		if(a[i]>0){
			sum++;
			ans+=a[i];
		}
	}
	for(int i=1;i<=n;i++){
		nxt[i]=i+1;
		pre[i]=i-1;
		q.push(make_pair(a[i],i));
	}
	while(sum>m){
		sum--;
		while(mark[q.top().second]){
			q.pop();
		}
		int x=q.top().second;
		q.pop();
		if(pre[x]!=0&&nxt[x]!=n+1){
			ans-=abs(a[x]);
		}
		else{
			if(a[x]>0){
				ans-=a[x];
			}
			else{
				sum++;
				continue;
			}
		}
		a[x]=a[pre[x]]+a[nxt[x]]+a[x];
		del(pre[x]);
		del(nxt[x]);
		q.push(make_pair(a[x],x));
	}
    cout<<ans<<endl;
    return 0;
}