Submission #794511

#TimeUsernameProblemLanguageResultExecution timeMemory
794511Sohsoh84The Big Prize (IOI17_prize)C++17
100 / 100
51 ms5324 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; const int MAX = 500; // CHANGE const int SQ = 256; const int MAXN = 2e5 + 10; #define debug(x) cerr << #x << ": " << x << endl; #define sep ' ' int n; vector<int> res[MAXN]; bool B[MAXN]; inline vector<int> assk(int ind) { if (B[ind]) return res[ind]; B[ind] = true; return res[ind] = ask(ind); } inline int sum(int ind) { vector<int> res = assk(ind); return res[0] + res[1]; } inline int find_cheapest() { int best_val = 0; for (int i = 0; i < min(n, MAX); i++) { int val = sum(i); if (val > best_val) best_val = val; } return best_val; } inline int solve(int lim = 1) { int lc = 0; int ind = 0; while (ind < n) { int tr = min(ind + SQ - 1, n - 1); vector<int> res = assk(tr); if (sum(tr) > lim) return solve(sum(tr)); if (res[0] + res[1] == lim && lc == res[0]) { ind = ind + SQ; continue; } int l = ind, r = min(ind + SQ - 1, n - 1); while (l < r) { int mid = (l + r) >> 1; vector<int> res = assk(mid); if (sum(mid) > lim) return solve(sum(mid)); if (res[0] + res[1] < lim || res[0] > lc) r = mid; else l = mid + 1; } if (sum(l) == 0) return l; if (sum(l) > lim) return solve(sum(l)); ind = l + 1; lc++; } return 0; } int find_best(int n_) { n = n_; return solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...