Submission #242658

#TimeUsernameProblemLanguageResultExecution timeMemory
242658maximath_1Holiday (IOI14_holiday)C++11
100 / 100
878 ms6904 KiB
#include "holiday.h" #include <bits/stdc++.h> using namespace std; #define ll long long const ll inf=4e18; ll ans=0ll; pair<int, int>a[100005]; int n, s, d, ptr, pos[100005]; pair<ll, int>st[100005*4]; void upd(int nd, int cl, int cr, int pos, bool is){ if(cl == cr){ if(is) st[nd] = {a[pos].first, 1}; else st[nd] = {0, 0}; return; } int md = (cl+cr)/2; if(pos<=md) upd(nd*2, cl, md, pos, is); else upd(nd*2+1, md+1, cr, pos, is); st[nd] = {st[nd*2].first+st[nd*2+1].first, st[nd*2].second+st[nd*2+1].second}; } ll k_best(int nd, int cl, int cr, int k){ if(k <= 0) return 0; if(st[nd].second <= k) return st[nd].first; int md = (cl+cr)/2; if(st[nd*2].second >= k) return k_best(nd*2, cl, md, k); return st[nd*2].first + k_best(nd*2+1, md+1, cr, k-st[nd*2].second); } void solve(int l, int r, int opt_l, int opt_r){ if(l > r) return; int md = (l+r)/2; pair<ll, int> res = {-inf, -1}; if(md < ptr) for(int i=md; i<ptr; i++) upd(1, 1, n, pos[i], true); else for(int i=ptr; i<md; i++) upd(1, 1, n, pos[i], false); ptr = md; for(int i=opt_l; i<=opt_r; i++){ upd(1, 1, n, pos[i], true); res = max(res, {k_best(1, 1, n, d+2*md-s-i), -i}); } ans = max(ans, res.first); int opt = -res.second; for(int i=opt; i<=opt_r; i++) upd(1, 1, n, pos[i], false); solve(md+1, r, opt, opt_r); for(int i=opt_l; i<opt; i++) upd(1, 1, n, pos[i], false); solve(l, md-1, opt_l, opt); } ll findMaxAttraction(int N, int S, int D, int A[]){ n = N, s = S+1, d = D; for(int i=1; i<=n; i++) a[i] = {A[i-1], i}; sort(a+1, a+n+1, greater<pair<int, int> >()); for(int i=1; i<=n; i++) pos[a[i].second] = i; ptr = s+1; solve(1, s, s, n); for(int i=1; i<=n; i++){ pos[n-a[i].second+1] = i; upd(1, 1, n, i, false); } s = n-s+1; ptr = s+1; solve(1, s, s, n); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...