Submission #794763

#TimeUsernameProblemLanguageResultExecution timeMemory
794763fatemetmhrThe Big Prize (IOI17_prize)C++17
0 / 100
531 ms1048576 KiB
// ~ Be Name Khoda ~ // #include "prize.h" #include <bits/stdc++.h> //#pragma GCC optimize ("O3") //#pragma GCC target("avx2") //#pragma GCC optimize("unroll-loops,Ofast") using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn = 1e6 + 10; const int maxn5 = 5e5 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const ll inf = 1e18; pair <int, int> ans[maxn5]; bool mark[maxn5]; int mx = 0, done = 0, dim = -1; pair <int, int> assk(int id){ if(!mark[id]){ vector <int> x = ask(id); mark[id] = true; ans[id].fi = x[0]; ans[id].se = x[1]; } mx = max(mx, ans[id].fi + ans[id].se); if(ans[id].fi + ans[id].se == 0) dim = id; return ans[id]; } void solve(int l, int r, int x){ if(dim != -1) return; int mid = (l + r) >> 1; int ptl = mid, ptr = mid + 1; int found = 0; while((ptl >= l || ptr < r) && found < x){ assk(ptl); if(dim != -1) return; if(ans[ptl].fi + ans[ptl].se == mx){ ptr--; mid = ptl; break; } else found++; if(found == x) break; assk(ptr); if(dim != -1) return; if(ans[ptr].fi + ans[ptr].se == mx){ mid = ptr; break; } else found++; ptl--; ptr++; } if(found == x){ done += found; for(int i = l; i < r; i++) if(mark[i] && ans[i].fi + ans[i].se == 0) dim = i; return; } int lef = ans[mid].fi - done; for(int i = ptl; i < mid; i++) if(ans[i].fi + ans[i].se != mx) lef--; solve(l, ptl, lef); if(dim != -1) return; int rig = ans[mid].fi - done; for(int i = ptl; i <= ptr; i++) if(ans[i].fi + ans[i].se != mx) rig--; solve(ptr + 1, r, rig); } int find_best(int n){ int tt = 500; while(tt--) assk(rng() % n); solve(0, n, mx); return dim; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...