Submission #117552

#TimeUsernameProblemLanguageResultExecution timeMemory
117552nvmdavaThe Big Prize (IOI17_prize)C++17
20 / 100
95 ms5452 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; vector<int> ask(int i); vector<int> res[200005]; int ans; int big, nn; set<int> lol; vector<int> query(int i){ if(res[i].size() == 2) return res[i]; if(i == 0) return vector<int>({0, big}); if(i == nn + 1) return vector<int>({big, 0}); return ask(i - 1); } void find(int l, int r){ if(ans) return; if(res[l][0] == res[r][0]) return; auto it = lol.find(l); while(res[l][0] == res[*it][0]){ l = *it; it++; } it = lol.find(r); while(res[r][0] == res[*it][0]){ r = *it; it--; } int ll, rr, m = (l + r) >> 1; res[m] = query(m); if(res[m][0] + res[m][1] == big){ lol.insert(m); find(l, m); find(m, r); return; } if(res[m][0] + res[m][1] == 0){ ans = m; return; } for(rr = m + 1; rr < r; rr++){ res[rr] = query(rr); if(res[rr][0] + res[rr][1] == big){ lol.insert(rr); find(rr, r); break; } if(res[rr][0] + res[rr][1] == 0){ ans = rr; return; } } for(ll = m - 1; ll > l; ll--){ res[ll] = query(ll); if(res[ll][0] + res[ll][1] == big){ lol.insert(ll); find(l, ll); break; } if(res[ll][0] + res[ll][1] == 0){ ans = ll; return; } } } int find_best(int n) { nn = n; for(int i = 0; i < 3; i++) { vector<int> res = ask(i); if(res[0] + res[1] == 0) return i; big = max(big, res[0] + res[1]); } res[0] = query(0); res[nn + 1] = query(nn + 1); lol.insert(0); lol.insert(nn + 1); find(0, nn + 1); return ans - 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...