제출 #1184066

#제출 시각아이디문제언어결과실행 시간메모리
1184066alterio커다란 상품 (IOI17_prize)C++20
20 / 100
27 ms6304 KiB
#include "prize.h"
#include <bits/stdc++.h>

using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int mxn = 2e5 + 10;

int L, R;

vector<int> know[mxn];

vector<int> get(int x) {
	if (know[x].size()) return know[x];
	return know[x] = ask(x);
}

void solve(int l, int r) {
	if (l > R || r < L || l > r) return;
	if (get(l)[0] + get(l)[1] == 0) {
		L = R = l;
		return;
	}
	if (get(r)[0] + get(r)[1] == 0) {
		L = R = r;
		return;
	}
	if (r - l <= 1) return;
	vector<int> valL = get(l), valR = get(r);
	int x = uniform_int_distribution<int> (l + 1, r - 1)(rng);
	vector<int> valX = get(x);
	int sumL = valL[0] + valL[1], sumR = valR[0] + valR[1], sumX = valX[0] + valX[1];
	if (sumX == 0) {
		L = R = x;
		return;
	}
	if (valX[0] + valX[1] == 1) {
		if (valX[0] == 0) {
			L = max(L, x + 1);
			solve(x + 1, r - 1);
		}
		else {
			R = min(R, x - 1);
			solve(l + 1, x - 1);
		}
	}
	else {
		if (sumX < sumL && sumX < sumR) {
			if (valX[0] > valX[1]) solve(l, x - 1);
			else solve(x + 1, r);
		}
		else solve(l + 1, r - 1);
	}
}

int find_best(int n) {
	L = 0, R = n - 1;
	solve(L, R);
	return L;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...