Submission #1326299

#TimeUsernameProblemLanguageResultExecution timeMemory
1326299apxoThe Big Prize (IOI17_prize)C++20
97.61 / 100
17 ms4768 KiB
#include "prize.h" #include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { assert(l <= r); return uniform_int_distribution<int> (l, r)(rng); } const int maxn = 2e5 + 5; const int B = 478; vector<int> que[maxn]; int cnt_asks; vector<int> abc(int i) { ++cnt_asks; if(!que[i].empty()) { return que[i]; } else { return que[i] = ask(i); } } int ans, mx; void calc(int l, int r) { if (r - l < 2 || ans != -1) return; if (que[r][0] - que[l][0] == 0) return; int mid = (l + r) >> 1; int pl = mid, pr = mid; bool skip_left = 0, skip_right = 0; while (pr < r) { abc(pr); if (que[pr][0] + que[pr][1] == 0) { ans = pr; return; } if (que[pr][0] == 0) skip_left = 1; if (que[pr][1] == 0) { skip_right = 1; break; } if (que[pr][0] + que[pr][1] == mx) break; ++pr; } if (!skip_right) { calc(pr, r); } if (skip_left) return; while (pl > l) { abc(pl); if (que[pl][0] + que[pl][1] == 0) { ans = pl; return; } if (que[pl][0] == 0) { skip_left = 1; break; } if (que[pl][0] + que[pl][1] == mx) break; --pl; } if (!skip_left) { calc(l, pl); } } int find_best(int n) { ans = -1; int x = min(n - 1, B); for (int i = 0; i <= x; ++i) { vector<int> cur = abc(i); if (cur[0] + cur[1] == 0) return i; mx = max(mx, cur[0] + cur[1]); } while (x >= 0) { if (que[x][0] + que[x][1] == mx) break; --x; } int lst = n - 1; while (lst >= 0) { vector<int> cur = abc(lst); if (cur[0] + cur[1] == 0) return lst; if (cur[0] + cur[1] == mx) break; --lst; } calc(x, lst); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...