# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
405330 | temurbek_khujaev | The Big Prize (IOI17_prize) | C++17 | 74 ms | 408 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 "prize.h"
#include <bits/stdc++.h>
using namespace std;
int SQ;
int first_small(int l, int r, int ls, int rs) {
while (l <= r) {
int m = (l + r) >> 1;
vector<int> v = ask(m);
if (v[0] + v[1] < SQ) {
r = m;
if (l == r) {
if (v[0] + v[1] == 0) return -m;
else return m;
}
} else {
if (v[0] > ls) r = m - 1;
else {
l = m + 1;
}
}
}
// if (pos != -1) pos = 1 / 0;
}
const int k = 250;
int small_solution(int n) {
for (int i = 0; i < n; i++) {
vector<int> v = ask(i);
if (v[0] + v[1] == 0) return i;
}
}
int find_best(int n) {
if (n < 5000) return small_solution(n);
vector<int> v = ask(0);
if (v[0] + v[1] == 0) return 0;
SQ = 1;
set<int> s = {0};
for (int i = 0; i < 450; i++) {
int x = rand() % n;
while (s.count(x)) x = rand() % n;
s.insert(x);
v = ask(x);
if (v[0] + v[1] == 0) return x;
SQ = max(SQ, v[0] + v[1]);
}
cerr << "SQ = " << SQ << endl;
v = ask(n - 1);
while (v[0] + v[1] < SQ) {
if (v[0] + v[1] == 0) return n - 1;
n--;
v = ask(n - 1);
}
cerr << "new n = " << n << endl;
int i = min(n - 1, k);
int lc = 0;
int j = 0;
while (true) {
v = ask(i);
while (v[0] + v[1] < SQ) {
if (v[0] + v[1] == 0) return i;
v = ask(++i);
}
int rc = v[1];
int cnt = v[0] - lc;
while (cnt--) {
int p = first_small(j, i - 1, lc, rc);
if (p < 0) return -p;
j = p + 1;
lc++;
}
lc = v[0];
j = i + 1;
if (i == n - 1) break;
i = min(i + k, n - 1);
}
return -1;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |