# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1256058 | gelastropod | The Big Prize (IOI17_prize) | C++20 | 0 ms | 0 KiB |
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
int find_best(int n) {
// 5 types!
vector<pair<int, int>> cache(n, { -1, -1 });
set<int> found;
int crnt = 0;
while (crnt < n) {
auto qry = cache[crnt];
if (qry.first == -1) {
found.insert(crnt);
auto j = ask(crnt);
qry = { j[0], j[1] };
cache[crnt] = qry;
}
if (qry.first + qry.second == 0) return crnt;
if (qry.first + qry.second >= 34) break;
crnt++;
}
while (crnt < n) {
auto crntval = cache[crnt];
if (crntval.first == -1) {
found.insert(crnt);
auto j = ask(crnt);
crntval = { j[0], j[1] };
cache[crnt] = crntval;
}
int low = crnt, high = n - 1, ans = crnt;
for (int i : found) {
if (cache[i].second == crntval.second) {
low = max(low, i);
}
if (i > crnt && cache[i].second != crntval.second) {
high = min(high, i);
}
}
while (low <= high) {
int x = (low + high) / 2;
pair<int, int> qry = cache[x];
if (qry.first == -1) {
found.insert(x);
auto j = ask(x);
qry = { j[0], j[1] };
cache[x] = qry;
}
if (qry.second != crntval.second) {
high = x - 1;
}
else {
low = x + 1;
ans = x;
}
}
crnt = ans + 1;
while (crnt < n) {
auto qry = cache[crnt];
if (qry.first == -1) {
found.insert(crnt);
auto j = ask(crnt);
qry = { j[0], j[1] };
cache[crnt] = qry;
}
if (qry.first + qry.second == 0) return crnt;
if (qry.first + qry.second >= lolpop) break;
crnt++;
}
}
}