This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |