Submission #1036824

#TimeUsernameProblemLanguageResultExecution timeMemory
1036824yellowtoadCandies (JOI18_candies)C++17
100 / 100
261 ms21068 KiB
#include <iostream>
#include <set>
#include <queue>
#define f first
#define s second
using namespace std;

long long n, a[200010], b[1000010], odd[200010], even[200010], sum;
priority_queue<pair<long long,pair<int,int>>> pq;
set<pair<int,int>> bst;
set<pair<int,int>>::iterator iter;

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) {
		odd[i] = odd[i-1];
		even[i] = even[i-1];
		if (i%2) odd[i] += a[i];
		else even[i] += a[i];
	}
	for (int i = 1; i <= n; i++) {
		bst.insert({i,i});
		pq.push({a[i],{i,i}});
	}
	for (int i = 1; i <= (n+1)/2; i++) {
		while ((bst.find(pq.top().s) == bst.end()) || ((pq.top().s.f == 0) || (pq.top().s.s == n+1))) pq.pop();
		sum += pq.top().f;
		int l = pq.top().s.f-1, r = pq.top().s.s+1;
		bst.erase(pq.top().s);
		pq.pop();
		iter = bst.lower_bound({l,r});
		if (iter != bst.begin()) {
			iter = prev(iter);
			if ((*iter).s == l) {
				l = (*iter).f;
				bst.erase(iter);
			}
		}
		iter = bst.lower_bound({l,r});
		if (iter != bst.end()) {
			if ((*iter).f == r) {
				r = (*iter).s;
				bst.erase(iter);
			}
		}
		cout << sum << "\n";
		bst.insert({l,r});
		if (l%2) pq.push({odd[r]-odd[l-1]-even[r]+even[l-1],{l,r}});
		else pq.push({-odd[r]+odd[l-1]+even[r]-even[l-1],{l,r}});
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...