Submission #1209455

#TimeUsernameProblemLanguageResultExecution timeMemory
1209455HappyCapybaraHoliday (IOI14_holiday)C++20
100 / 100
705 ms12640 KiB
#include"holiday.h" #include<bits/stdc++.h> using namespace std; #define ll long long int n, d; vector<int> a; vector<ll> l1, l2, r1, r2; void solve(int s, int k, vector<ll>& dp){ dp[0] = 0; vector<int> opt(d+1); opt[0] = s; for (int j=16; j>=0; j--){ ll cur = 0; priority_queue<ll> in, out; out.push(a[s]); for (int i=1<<j; i<=d; i+=1<<(j+1)){ int l = opt[i-(1<<j)], r = i+(1<<j) <= d ? opt[i+(1<<j)] : n-1; pair<ll,int> bsf = {0, s}; for (int loc=l; loc<=r; loc++){ if (loc != l) out.push(a[loc]); int vis = i-k*(loc-s); if (vis < 0) continue; while (in.size() < vis && !out.empty()){ in.push(-out.top()); cur += out.top(); out.pop(); } while (in.size() > vis){ cur += in.top(); out.push(-in.top()); in.pop(); } while (!in.empty() && !out.empty() && -in.top() < out.top()){ cur += in.top(); cur += out.top(); out.push(-in.top()); in.pop(); in.push(-out.top()); out.pop(); } bsf = max(bsf, {cur, loc}); } dp[i] = bsf.first; opt[i] = bsf.second; } } } ll findMaxAttraction(int n, int start, int d, int attraction[]){ ::n = n; ::d = d; a.resize(n); for (int i=0; i<n; i++) a[i] = attraction[i]; r1.resize(d+1); r2.resize(d+1); l1.resize(d+1); l2.resize(d+1); solve(start, 1, r1); solve(start, 2, r2); a[start] = 0; reverse(a.begin(), a.end()); start = n-1-start; solve(start, 1, l1); solve(start, 2, l2); ll res = 0; for (int i=0; i<=d; i++) res = max(res, max(l2[i]+r1[d-i], l1[i]+r2[d-i])); return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...