Submission #892186

#TimeUsernameProblemLanguageResultExecution timeMemory
89218612345678Holiday (IOI14_holiday)C++17
23 / 100
458 ms15848 KiB
#include"holiday.h" #include <bits/stdc++.h> using namespace std; #define ll long long const int nx=1e5+5, dx=250005; int id[nx], st, N, D; ll ans, dp[4][dx]; vector<pair<ll, int>> v; struct segtree { int f[4*nx]; ll sm[4*nx]; void update(int l, int r, int i, int idx, ll val) { //cout<<"inupadate "<<val<<'\n'; if (idx<l||r<idx) return; if (l==r) { if (val>=0) return f[i]=1, sm[i]=val, void(); else return f[i]=0, sm[i]=0, void(); } int md=(l+r)/2; update(l, md, 2*i, idx, val); update(md+1, r, 2*i+1, idx, val); f[i]=f[2*i]+f[2*i+1]; sm[i]=sm[2*i]+sm[2*i+1]; } ll query(int l, int r, int i, int cnt) { if (cnt>=f[i]) return sm[i]; if (cnt<=0) return 0; int md=(l+r)/2; if (f[2*i]>cnt) return query(l, md, 2*i, cnt); return sm[2*i]+query(md+1, r, 2*i+1, cnt-f[2*i]); } } s; void solver(int st, int ml, int sl) { int lst=st-1; queue<tuple<int, int, int, int>> q; q.push({0, D, st, N-1}); while (!q.empty()) { auto [l, r, optl, optr]=q.front(); //printf("%d %d %d %d\n", l, r, optl, optr); q.pop(); if (r<l) continue; int md=(l+r)/2; pair<ll, int> p={-1, -1}; //cout<<"value "<<md<<' '<<lst<<' '<<optl<<' '<<optr<<'\n'; for (int i=optl; i<=optr; i++) { while (lst<i) ++lst, s.update(0, N-1, 1, id[lst], v[id[lst]].first); //cout<<"update "<<lst<<' '<<id[lst]<<' '<<v[id[lst]].first<<'\n'; while (lst>i) s.update(0, N-1, 1, id[lst], -1), lst--; //cout<<"query "<<i<<' '<<md-1*(i-st)<<' '<<s.query(0, N-1, 1, md-1*(i-st))<<'\n'; p=max(p, make_pair(s.query(0, N-1, 1, md-1*(i-st)), i)); } dp[sl][md]=p.first; //cout<<md<<' '<<dp[sl][md]<<'\n'; q.push({l, md-1, optl, p.second}); q.push({md+1, r, p.second, optr}); } } long long int findMaxAttraction(int n, int start, int d, int attraction[]) { v.resize(n); for (int i=0; i<n; i++) v[i]={attraction[i], i}; sort(v.begin(), v.end()); reverse(v.begin(), v.end()); for (int i=0; i<n; i++) id[v[i].second]=i; N=n; D=d; st=start; solver(0, 1, 0); return dp[0][D]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...