Submission #43994

#TimeUsernameProblemLanguageResultExecution timeMemory
43994zscoderCandies (JOI18_candies)C++17
100 / 100
1135 ms47556 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define fi first #define se second #define mp make_pair #define pb push_back #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<ll,ll> ii; typedef vector<int> vi; typedef long double ld; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds; typedef set<ll>::iterator sit; typedef map<ll,ll>::iterator mit; ll a[211111]; int n; map<ii, ll> ma; set<ii> intervals; ll res[211111]; void solve_fast() { ma.clear(); intervals.clear(); multiset<pair<ll,ii> > pq; for(int i=0;i<n;i++) { pq.insert(mp(a[i], mp(i,i))); intervals.insert(mp(i,i)); ma[mp(i,i)] = a[i]; } ll ans = 0; for(int i=0;i<(n+1)/2;i++) { while(intervals.find((*prev(pq.end())).se)==intervals.end()) pq.erase(prev(pq.end())); ans += (*prev(pq.end())).fi; res[i+1] = ans; int l = (*prev(pq.end())).se.fi; int r = (*prev(pq.end())).se.se; auto it = intervals.find(mp(l,r)); auto itr = it; auto itl= it; itr++; itl--; vector<ii> era; if(it!=intervals.begin()) era.pb((*itl)); if(itr!=intervals.end()) era.pb((*itr)); if(itr!=intervals.end()&&it!=intervals.begin()) { int veryl = (*itl).fi; int veryr = (*itr).se; intervals.insert(mp(veryl,veryr)); ll V = ma[(*itl)] + ma[(*itr)] - ma[mp(l,r)]; ma[mp(veryl,veryr)] = V; pq.insert(mp(V, mp(veryl, veryr))); } intervals.erase(mp(l,r)); for(ii x:era) { intervals.erase(x); } } for(int i=1;i<=(n+1)/2;i++) cout<<res[i]<<'\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } solve_fast(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...