제출 #282476

#제출 시각아이디문제언어결과실행 시간메모리
282476doowey커다란 상품 (IOI17_prize)C++14
20 / 100
111 ms968 KiB
#include <bits/stdc++.h> #include "prize.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair map<int,pii> res; pii get(int x){ if(res.count(x)) return res[x]; vector<int> g = ask(x); res[x] = mp(g[0], g[1]); return mp(g[0],g[1]); } int low = 0; int solve(int li, int ri){ if(li > ri) return -1; while(li <= ri){ pii cur = get(li); if(cur.fi + cur.se == 0) return li; if(cur.fi + cur.se == low){ break; } li ++ ; } while(ri >= li){ pii cur = get(ri); if(cur.fi + cur.se == 0) return ri; if(cur.fi + cur.se == low){ break; } ri -- ; } if(li > ri) return -1; int has = get(ri).fi - get(li).fi; if(has == 0) return -1; int cl = li, cr = ri; int mid; int sol0, sol1; while(cl < cr){ mid = (cl + cr) / 2; pii cur = get(mid); if(cur.fi + cur.se == 0) return mid; if(cur.fi + cur.se == low){ pii lf = get(li); pii rf = get(ri); sol0 = sol1 = -1; if(cur.fi - lf.fi > 0){ sol0 = solve(li + 1, mid - 1); } if(rf.fi - cur.fi > 0){ sol1 = solve(mid + 1, ri - 1); } if(sol0 == -1) return sol1; return sol0; } else{ cr = mid; } } return -1; } int find_best(int n) { pii cur; for(int i = 0 ; i < min(n,500); i ++ ){ cur = get(i); if(cur.fi + cur.se == 0) return i; low = max(low, cur.fi + cur.se); } return solve(0, n - 1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...