Submission #1028666

#TimeUsernameProblemLanguageResultExecution timeMemory
1028666DorostWefThe Big Prize (IOI17_prize)C++17
97.68 / 100
26 ms596 KiB
#include "prize.h"
#include <bits/stdc++.h>

using namespace std;

int cnt;

int solve (int l, int r, int cl, int cr) {
	if (l > r || cl + cr == cnt)
		return 0;
	if (l == r) {
		vector<int> a = ask(l);
		if (a[0] + a[1] == 0)
			return l;
		return 0;
	}
	int wef = cl + cr;
	int mid = (l + r) >> 1;
	int mn = mid, mx = mid;
	bool L = true, R = true;
	for (int i = 0; i < cnt - wef; i++) {
		int x;
		if (i % 2 == 1) {
			x = mid + i / 2 + 1;
		} else {
			x = mid - i / 2;
		}
		mn = min (mn, x);
		mx = max (mx, x);
		vector<int> a = ask(x);
		if (a[0] + a[1] == 0)
			return x;
		if (a[0] + a[1] == cnt) {
			int ans = 0;
			if (L) {
				if (x == mn) 
					ans ^= solve (l, mn - 1, cl, a[1]);
				else
					ans ^= solve (l, mn - 1, cl, a[1] + i);
			}
			if (R) {
				if (x == mx)
					ans ^= solve (mx + 1, r, a[0], cr);
				else
					ans ^= solve (mx + 1, r, a[0] + i, cr);
			}
			return ans;
		}
		if (a[0] == 0)
			L = false;
		if (a[1] == 0)
			R = false;
	}
	return 0;
}

int find_best(int n) {
	for (int i = max (0, n - 473); i < n; i++) {
		vector<int> a = ask(i);
		if(a[0] + a[1] == 0)
			return i;
		cnt = max (cnt, a[0] + a[1]);
	}
	return solve (0, n - 1, 0, 0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...