Submission #794511

#TimeUsernameProblemLanguageResultExecution timeMemory
794511Sohsoh84The Big Prize (IOI17_prize)C++17
100 / 100
51 ms5324 KiB

#include "prize.h"
#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX = 500; // CHANGE
const int SQ = 256;
const int MAXN = 2e5 + 10;
 
#define debug(x)		cerr << #x << ": " << x << endl;
#define sep			' '
 
int n;
vector<int> res[MAXN];
bool B[MAXN];
 
inline vector<int> assk(int ind) {
	if (B[ind]) return res[ind];
	B[ind] = true;
	return res[ind] = ask(ind);
}
 
inline int sum(int ind) {
	vector<int> res = assk(ind);
	return res[0] + res[1];
}
 
inline int find_cheapest() {
	int best_val = 0;
	for (int i = 0; i < min(n, MAX); i++) {
		int val = sum(i);
		if (val > best_val)
			best_val = val;
 
	}
 
	return best_val;
}
 
inline int solve(int lim = 1) {
	int lc = 0;
	int ind = 0;
	while (ind < n) {
		int tr = min(ind + SQ - 1, n - 1);
		vector<int> res = assk(tr);
		if (sum(tr) > lim) return solve(sum(tr));
		if (res[0] + res[1] == lim && lc == res[0]) {
			ind = ind + SQ;	
			continue;
		}
 
		int l = ind, r = min(ind + SQ - 1, n - 1);
		while (l < r) {
			int mid = (l + r) >> 1;
			vector<int> res = assk(mid);
			if (sum(mid) > lim) return solve(sum(mid));
			if (res[0] + res[1] < lim || res[0] > lc) r = mid;
			else l = mid + 1;
		}
 
		if (sum(l) == 0) return l;
		if (sum(l) > lim) return solve(sum(l));

		ind = l + 1;
		lc++;
	}

	return 0;
}

int find_best(int n_) {
	n = n_;
	return solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...