# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
294832 | VodkaInTheJar | The Big Prize (IOI17_prize) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
mt19937 random_generator(23799971);
const int maxn = 2e5 + 3;
int max_sum;
bool is[maxn];
void f(int l, int r, int how_many, int sub_l, int sub_r)
{
if (l > r)
return;
if (how_many == r - l + 1)
{
for (int i = l; i <= r; i++)
is[i] = true;
return;
}
if (how_many <= (r - l + 1) * 7 / 8)
return;
for (;;)
{
int idx = l + random_generator() % (r - l + 1);
auto curr = ask(idx);
if (curr[0] + curr[1] == max_sum)
{
curr[0] -= sub_l;
curr[1] -= sub_r;
is[idx] = true;
f(l, idx-1, curr[0], sub_l, sub_r + curr[1] + 1);
f(idx+1, r, curr[1], sub_l + curr[0] + 1, sub_r);
break;
}
}
}
int find_best(int n)
{
for (int i = 1; i <= 100; i++)
{
int idx = random_generator() % n;
auto curr = ask(idx);
max_sum = max(max_sum, curr[0] + curr[1]);
}
f(0, n-1, n - max_sum, 0, 0);
for (int i = 0; i < n; i++)
if (!is[i])
{
auto curr = ask(i);
if (curr[0] + curr[1] == 0)
return i;
}
}