Submission #1252344

#TimeUsernameProblemLanguageResultExecution timeMemory
1252344PlayVoltzThe Big Prize (IOI17_prize)C++20
100 / 100
12 ms1972 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; #define pii pair<int, int> #define mp make_pair #define pb push_back #define fi first #define se second int mx=0, ans=-1; vector<pii> ooga; pii query(int a){ if (ooga[a].fi!=-1)return ooga[a]; vector<int> res=ask(a); if (!(res[0]+res[1]))ans=a; return ooga[a]=mp(res[0], res[1]); } void dnc(int l, int r, int cl, int cr){ if (l>r)return; for (int i=0; i<=r-l; ++i){ int lm=(l+r)/2-i/2, rm=(l+r)/2+(i+1)/2, m=(i%2?rm:lm); pii res=query(m); if (ans!=-1)return; if (res.fi+res.se==mx){ if (i%2){ if (res.se>cr)dnc(rm+1, r, res.fi, cr); if (res.fi-rm+lm>cl)dnc(l, lm-1, cl, res.se+rm-lm); } else{ if (res.fi>cl)dnc(l, lm-1, cl, res.se); if (res.se-rm+lm>cr)dnc(rm+1, r, res.fi+rm-lm, cr); } return; } } } int find_best(int n){ if (n==1)return 0; ooga.resize(n, mp(-1, -1)); int id=0; for (int i=0; i<sqrt(n)+30&&mx<27; ++i){ pii res=query(i); if (ans!=-1)break; if (res.fi+res.se>mx)mx=res.fi+res.se, id=i; } dnc(id, n-1, id, 0); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...