# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
370265 | doowey | The Big Prize (IOI17_prize) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 n;
int solve(int li, int ri){
if(li > ri) return -1;
pii ga = get(li);
if(ga.fi + ga.se == 0){
return li;
}
if(li == ri) return -1;
if(ga.fi + ga.se < low)
return solve(li + 1, ri);
int sha = ga.se;
pii gb = get(ri);
if(gb.fi + gb.se == 0)
return ri;
if(gb.fi + gb.se < low)
return solve(li, ri - 1);
int tot = ga.se - gb.se;
if(tot == 0) return -1;
int mid = (li + ri) / 2;
int sa = solve(li, mid);
if(sa != -1) return sa;
int sb = solve(mid + 1, ri);
return sb;
}
int find_best(int _n) {
n = _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, -1);
}