Submission #1134742

#TimeUsernameProblemLanguageResultExecution timeMemory
1134742nai0610Feast (NOI19_feast)C++20
0 / 100
1095 ms2740 KiB
#include <bits/stdc++.h>
#define ll int64_t
#define ld long double
using namespace std;
// 
const int maxn =3e5+5;
const int mod = 1e9+7; // 998244353,1610612741
const ll inf = 1e18;
const ld pi = atan(1.0L)*4;
int n,k,res[maxn];
int main() {
    // freopen("../input.inp","r",stdin);
    // freopen("output.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >>n>>k;
    int m=n;
    vector<int> a={-1};
    for (int i=1;i<=n;i++) {
    	int x;
    	cin >>x;
    	if (x) a.push_back(x);
    }
    n=a.size()-1;
    int i=1;
	set<pair<int,int>> s;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
	while (i<=n) {
		int val=0;
		int j=i;
		while (j<=n&&a[i]*a[j]>0) val+=a[j++];
		s.insert({i,val});
		i=j;
	}
	auto it=s.begin();
	while (!s.empty()&&(*it).second<0) s.erase(it),it=s.begin();
	if (!s.empty()){
		it =prev(s.end());
		while (!s.empty()&&(*it).second<0) s.erase(it),it=prev(s.end());
	}
	int cnt=s.size()/2+1;
	if (s.size()==0) {
		for (int i=1;i<=n;i++) res[i]=0;
		cout<<res[k];
	}
	else if (cnt==1) {
		for (int i=cnt;i<=n;i++) res[i]=(*s.begin()).second;
		cout<<res[k];
	}
	else {
		for (auto i=s.begin();i!=s.end();i++) q.push({abs((*i).second),(*i).first});
		int cur=cnt;
		int sum=0;
		for (auto i:s) {
			if (i.second>0) sum+=i.second;
		} 
		for (int i=cnt;i<=m;i++) res[i]=sum;
		for (int i=cnt-1;i>=1;i--) {
			while (cur>i) {
				while (1) {
					auto p=q.top();
					q.pop();
					it =s.lower_bound({p.second,-mod});
					if ((*it).first==p.second) break;
				}
				int id=(*it).first;
				if (it==s.begin()) {
					auto nex=next(it);
					cur-=((*it).second>0)+((*nex).second>0);
					sum-=((*it).second>0?(*it).second:0)+
					   ((*nex).second>0?(*nex).second:0);
					int nw=(*it).second+(*nex).second;
					cur +=(nw>0);
					if (nw>0) sum+=nw;
					s.erase(it);s.erase(nex);
					if (nw){
						s.insert({id,nw});
						q.push({abs(nw),id});
					}
				}
				else if (it==prev(s.end())) {
					auto pre=prev(it);
					cur-=((*it).second>0)+((*pre).second>0);
					sum-=((*it).second>0?(*it).second:0)+
					   ((*pre).second>0?(*pre).second:0);
					int nw=(*it).second+(*pre).second;
					cur +=(nw>0);
					if (nw>0) sum+=nw;
					s.erase(it);s.erase(pre);
					if (nw){
						s.insert({id,nw});
						q.push({abs(nw),id});
					}
				}
				else{
					auto pre=prev(it),nex=next(it);
					cur -= ((*pre).second>0)+((*it).second>0)+((*nex).second>0);
					sum -= ((*pre).second>0?(*pre).second:0)+
						   ((*it).second>0?(*it).second:0)+
						   ((*nex).second>0?(*nex).second:0);
					int nw=(*pre).second+(*it).second+(*nex).second;
					cur +=(nw>0);
					if (nw>0) sum+=nw;
					s.erase(pre);s.erase(it);s.erase(nex);
					if (nw){
						s.insert({id,nw});
						q.push({abs(nw),id});
					}
				}
			}
			res[i]=sum;
		}
		cout<<res[k]<<'\n';
	}
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...