Submission #1285028

#TimeUsernameProblemLanguageResultExecution timeMemory
1285028mariaclaraThe Big Prize (IOI17_prize)C++17
100 / 100
13 ms440 KiB
#include "prize.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef vector<int> vi; #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() #define mk make_pair #define pb push_back #define fr first #define sc second int max_loli; int query(int l, int r, int pl, int pr) { int ml = (l+r)/2 - 1, mr = ml + 1, pml = pr, pmr = -1; while(mr <= r) { vi rsp = ask(mr); if(rsp[0] + rsp[1] == max_loli) { pml = rsp[0] - (mr - ml - 1); pmr = rsp[0]; mr++; break; } if(rsp[0] + rsp[1] == 0) return mr; mr++; pml--; } int ret = -1; if(pl < pml and l <= ml) ret = query(l, ml, pl, pml); if(pmr < pr and mr <= r and ret == -1) ret = query(mr, r, pmr, pr); return ret; } int find_best(int N) { const int C = max(N/500, 1); vi L, R, A, B; for(int i = 0; i < N; i += C) { L.pb(i); R.pb(min(N-1, i+C-1)); vi rsp = ask(R.back()); if(rsp[0] + rsp[1] == 0) return R.back(); A.pb(rsp[0]); B.pb(rsp[1]); max_loli = max(max_loli, rsp[0] + rsp[1]); } int ans = -1, last_pref = 0; for(int i = 0; i < sz(L); i++) { int l = L[i], r = R[i]-1, at_pref = -1; if(A[i] + B[i] == max_loli) at_pref = A[i]; while(at_pref == -1 and r >= l) { vi rsp = ask(r); if(rsp[0] + rsp[1] == max_loli) at_pref = rsp[0]; if(rsp[0] + rsp[1] == 0) return r; r--; } if(last_pref < at_pref and l <= r) ans = max(ans, query(l, r, last_pref, at_pref)); last_pref = at_pref + (R[i] - r - 1); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...