Submission #1113349

#TimeUsernameProblemLanguageResultExecution timeMemory
1113349epicci23The Big Prize (IOI17_prize)C++17
90 / 100
134 ms2524 KiB
#include "bits/stdc++.h" #include "prize.h" //#define int long long #define all(v) v.begin() , v.end() #define sz(a) (int)a.size() using namespace std; const int S = 100; const int S2 = 10; int suf = -1; vector<int> Cache={-1,-1}; map<int,vector<int>> dp; vector<int> Ask(int i){ if(dp.count(i)) return dp[i]; return dp[i]=ask(i); } int ask_all(int l,int r){ for(int i=l;i<=r;i++){ vector<int> x = Ask(i); if(x[0]+x[1]==0) return i; if(x[1]==suf) Cache=x; else suf--; } return -23; } int Learn(int l,int r){ if(l>r) return -1; if(l==r){ auto u = Ask(l); if(u[0]+u[1]==0) return l; if(u[1]==suf) Cache=u; else suf--; return -1; } auto X = Ask(r); if(X[0]+X[1]==0) return r; if(X[1]==suf) return -1; int mid = (l+r)/2; auto u = Ask(mid); if(u[0]+u[1]==0) return mid; if(u[1]==suf) return Learn(mid+1,r); int lf = Learn(l,mid-1); if(lf!=-1) return lf; if(u[1]==suf) Cache=u; else suf--; return Learn(mid+1,r); } int find_best(int n){ if(n<=1000) return ask_all(0,n-1); for(int i=0;i<=500;i++){ vector<int> x = Ask(i); if(x[0]+x[1]==0) return i; if(x[0]+x[1]>=Cache[0]+Cache[1]){ Cache=x; suf=Cache[1]; } else suf--; } return Learn(501,n-1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...