Submission #70318

#TimeUsernameProblemLanguageResultExecution timeMemory
70318gnoorThe Big Prize (IOI17_prize)C++17
100 / 100
69 ms2116 KiB
#include "prize.h" #include <vector> #include <algorithm> #include <cstring> using namespace std; int lft[200100]; int rgt[200100]; int _ask(int x) { if (lft[x]!=-1) return lft[x]+rgt[x]; auto res = ask(x); lft[x]=res[0]; rgt[x]=res[1]; return lft[x]+rgt[x]; } int mx=-1; int ans=-1; bool solve(int l,int r,int sl,int sr) { int m=(l+r)>>1; int res; while (m<=r) { res=_ask(m); if (res==0) { ans=m; return false; } if (res>mx) { mx=res; return false; } if (res==mx) break; m++; } if (m>r) { //not found m=(l+r)>>1; m--; while (m>=l) { res=_ask(m); if (res==0) { ans=m; return false; } if (res>mx) { mx=res; return false; } if (res==mx) break; m--; } if (m<l) { //not found return true; } } //normal int ll=lft[m]-sl; int rr=rgt[m]-sr; if (ll) if (!solve(l,m-1,sl,rgt[m])) return false; if (rr) if (!solve(m+1,r,lft[m],sr)) return false; return true; } int find_best(int n) { memset(lft,-1,sizeof(lft)); memset(rgt,-1,sizeof(rgt)); while (ans==-1) { solve(0,n-1,0,0); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...