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...