Submission #876718

#TimeUsernameProblemLanguageResultExecution timeMemory
876718abczzThe Big Prize (IOI17_prize)C++14
100 / 100
25 ms2416 KiB
#include "prize.h" #include <iostream> #include <vector> #include <random> #include <chrono> #include <map> #define ll long long using namespace std; ll f; map <ll, vector<int> > mp; vector <int> R; vector <int> query(ll u) { if (mp.find(u) != mp.end()) return mp[u]; else return mp[u] = ask(u); } void solve(ll l, ll r, ll ql, ll qr) { if (l > r || ql + qr == R[0] + R[1]) return; ll mid = (l+r)/2; for (int i=mid; i<=r; ++i) { auto u = query(i); if (!u[0] && !u[1]) { f = i; return; } else if (u[0]+u[1] == R[0]+R[1]) { solve(l, mid-1, ql, u[1]+(i-mid)); if (f != -1) return; solve(i+1, r, u[0], qr); return; } else if (u[0]+u[1] > R[0]+R[1]) { R = u; f = 1e18; return; } } solve(l, mid-1, ql, qr+(r-mid+1)); } int find_best(int n) { mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); R = {-1, -1}; for (int i=0; i<100; ++i) { ll id = rng() % n; auto u = query(id); if (!u[0] && !u[1]) return id; if (u[0]+u[1] > R[0]+R[1]) swap(u, R); } while (true) { f = -1; solve(0, n-1, 0, 0); if (f != 1e18) break; } return f; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...