Submission #243291

#TimeUsernameProblemLanguageResultExecution timeMemory
243291rqiHoliday (IOI14_holiday)C++14
47 / 100
5063 ms7916 KiB
#include "holiday.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vl; #define mp make_pair #define f first #define s second #define sz(x) (int)x.size() #define all(x) begin(x), end(x) #define ins insert #define pb push_back template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } int n; int S; int d; vl w; ll solverightonly(int L, int days){ //only move right from L set<pair<ll, int>> taken; ll ans = 0; ll cursum = 0; for(int i = L; i < n; i++){ int num = days-(i-L); if(num <= 0) break; if(sz(taken) > num){ assert(num == sz(taken)-1); pair<ll, int> lowest = *(taken.begin()); taken.erase(lowest); cursum-=lowest.f; } pair<ll, int> couldtake = mp(w[i], i); if(sz(taken) < num){ taken.ins(couldtake); cursum+=couldtake.f; } else{ pair<ll, int> lowest = *(taken.begin()); if(lowest.f < couldtake.f){ taken.erase(lowest); cursum-=lowest.f; taken.ins(couldtake); cursum+=couldtake.f; } } ckmax(ans, cursum); } return ans; } ll solve(){ //go left, then right ll ans = 0; for(int i = S; i >= 0; i--){ ckmax(ans, solverightonly(i, d-(S-i))); } return ans; } ll findMaxAttraction(int _n, int start, int _d, int attraction[]) { n = _n; S = start; d = _d; for(int i = 0; i < n; i++){ w.pb(attraction[i]); } if(start == 0){ return solverightonly(0, d); } ll ans = 0; ckmax(ans, solve()); S = n-1-S; reverse(all(w)); ckmax(ans, solve()); 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...