Submission #267511

#TimeUsernameProblemLanguageResultExecution timeMemory
267511PeppaPigThe Big Prize (IOI17_prize)C++14
90 / 100
139 ms11416 KiB
#include "prize.h"
#include <bits/stdc++.h>

using namespace std;

vector<vector<int> > val;

vector<int> query(int i) {
	if(val[i][0] == -1) return val[i] = ask(i);
	return val[i];
}

int find_best(int n) {
	val = vector<vector<int> >(n, vector<int>(2, -1));

	int idx = -1;
	vector<int> vec(2);
	for(int i = 0; i < min(n, 480); i++) {
		vector<int> now = query(i);
		if(now[0] + now[1] == 0) return i;
		if(now[0] + now[1] > vec[0] + vec[1])
			vec = now, idx = i;
	}

	bool bad = true;
	while(1) {
		if(bad) {
			int l = idx + 1, r = n - 1;
			while(l < r) {
				int mid = (l + r) >> 1;
				vector<int> now = query(mid);
				if(make_pair(vec[0], vec[1]) != make_pair(now[0], now[1]))
					r = mid;
				else l = mid + 1;
			}
			idx = r, bad = false;
		} else {
			vector<int> now = query(idx);
			if(now[0] + now[1] == 0) return idx;
			now = query(++idx);
			if(now[0] + now[1] == vec[0] + vec[1])
				bad = true, vec = now;
		}
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...