Submission #1241681

#TimeUsernameProblemLanguageResultExecution timeMemory
1241681SpyrosAlivThe Big Prize (IOI17_prize)C++20
90 / 100
21 ms408 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;

int find_best(int n) {
	if (n <= 10000) {
		for (int i = 0; i < n; i++) {
			vector<int> ret = ask(i);
			if (ret[0] + ret[1] == 0) return i;
		}
		assert(false);
		return -1;
	}
	int ll = 0, rr = n-1;
	int need = 0;
	vector<int> lastTot;
	for (int i = 0; i < 500; i++) {
		vector<int> curr = ask(i);
		need = max(need, curr[0] + curr[1]);
		if (curr[0] + curr[1] == 0) return i;
		if (curr[0] + curr[1] == need) {
			ll = i;
			lastTot = curr;
		}
	}
	while (true) {
		int lo = ll+1, hi = rr;
		int idx = -1;
		while (lo <= hi) {
			int mid = (lo + hi) / 2;
			vector<int> tot = ask(mid);
			if (tot[0] + tot[1] == 0) return mid;
			if (tot[0] + tot[1] < need) {
				idx = mid;
				hi = mid-1;
				continue;
			}
			int toL = tot[0] - lastTot[0];
			if (toL) {
				hi = mid-1;
			}
			else lo = mid+1;
		}	
		assert(idx != -1);
		ll = idx+1;
		lastTot = ask(ll);
		while (lastTot[0] + lastTot[1] != need) {
			if (lastTot[0] + lastTot[1] == 0) return ll;
			ll++;
			lastTot = ask(ll);
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...