Submission #1205261

#TimeUsernameProblemLanguageResultExecution timeMemory
1205261shadowcoderThe Big Prize (IOI17_prize)C++20
0 / 100
23 ms428 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; const int maxn = 200005; bool asked[maxn]; int ansL[maxn], ansR[maxn]; void query(int pos) { if (asked[pos] == true) return; vector<int> curr = ask(pos); ansL[pos] = curr[0]; ansR[pos] = curr[1]; } int find_best(int n) { if (n <= 5000) { for (int i = 0; i < n; ++i) { query(i); if (ansL[i] + ansR[i] == 0) return i; } } for (int i = 0; i < 500; ++i) { query(i); } int start = 0, better = 0; int maxSum = 0; for (int i = 1; i < 500; ++i) { if (ansL[start] + ansR[start] < ansL[i] + ansR[i]) { start = i; better = i - 1; maxSum = ansL[i] + ansR[i]; } else { ++better; } } while (true) { int l = start + 1; int r = n - 1; while (l <= r) { int mid = (l + r) / 2; query(mid); if (ansL[mid] + ansR[mid] == 0) return mid; if (ansL[mid] + ansR[mid] < maxSum) { r = mid - 1; } else { if (ansL[mid] + ansR[mid] > better) r = mid - 1; else l = mid + 1; } } int blockEnd = r; for (int i = blockEnd + 1; i < n; ++i) { query(i); if (ansL[i] + ansR[i] == 0) return i; if (ansL[i] + ansR[i] == maxSum) { start = i; break; } ++better; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...