Submission #1164757

#TimeUsernameProblemLanguageResultExecution timeMemory
1164757SmuggingSpunThe Big Prize (IOI17_prize)C++20
100 / 100
914 ms11428 KiB
#include<bits/stdc++.h> #include "prize.h" using namespace std; int find_best(int n) { vector<vector<int>>cnt(n, vector<int>(2, -1)); vector<int>used; auto id = [&] (int i){ if(cnt[i][0] != -1){ return cnt[i]; } used.emplace_back(i); return cnt[i] = ask(i); }; auto sum = [&] (int i){ return id(i)[0] + id(i)[1]; }; auto same = [&] (int i, int j){ return sum(i) == sum(j); }; int ans = -1; if(sum(0) == 0){ ans = 0; } else if(sum(n - 1) == 0){ ans = n - 1; } else{ function<void(int, int)>solve; solve = [&] (int l, int r){ if(l > r || ans != -1 || (same(l - 1, r + 1) && id(r + 1)[0] - id(l - 1)[0] == 0)){ return; } int m = (l + r) >> 1; if(sum(m) == 0){ ans = m; } bool left = bool(l < m), right = bool(r > m); for(int& x : used){ if(x <= l && same(x, m) && id(m)[0] - id(x)[0] == 0){ left = false; } if(x >= r && same(m, x) && id(m)[1] - id(x)[1] == 0){ right = false; } if(!left && !right){ break; } } if(left){ solve(l, m - 1); } if(right){ solve(m + 1, r); } }; solve(1, n - 2); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...