Submission #286373

#TimeUsernameProblemLanguageResultExecution timeMemory
286373Atill83The Big Prize (IOI17_prize)C++14
97.93 / 100
68 ms5496 KiB
	#include "prize.h"
	#include <bits/stdc++.h>
	using namespace std;
	const int MAXN = (int) 2e5 + 5;
	vector<int> asked[MAXN];
	vector<int> kuc;
	bool kc[MAXN];
	vector<int> aski(int i){
		if(!asked[i].empty()) return asked[i];
		return asked[i] = ask(i);
	}




	int find_best(int n) {
		int top = 0;
		mt19937 gen(time(NULL));
		for(int i = 0; i < 470; i++){
			int u = gen() % n;
			vector<int> cev = aski(u);
			if(cev[0] + cev[1] == 0) return u;
			top = max(top, cev[0] + cev[1]);
		}
		//assert(top <= 600);


		while(true){
			int sz1 = kuc.size();
			int l = 0, r = n - 1;
			while(l < r){
				int m = (l + r) / 2;
				while(kc[m] && m > l) m--;
				if(m == l && kc[m]){
					m = (l + r) / 2;
					while(m < r && kc[m]) m++;
				}
				vector<int> cev = aski(m);
				if(cev[0] + cev[1] != top){
					l = m;
					r = m;
				}else{
					cev[0] -= lower_bound(kuc.begin(), kuc.end(), m) - kuc.begin();
					if(cev[0] > 0){
						r = m - 1;
					}else{
						l = m + 1;
					}
				}
			}
			vector<int> cev = aski(l);
			//assert(cev[0] + cev[1] != top);
			if(cev[0] == 0 && cev[1] == 0){
				return l;
			}else {
				//assert(kc[l] != 1);
				kuc.push_back(l);
				int idx = kuc.size() - 1;
				while(idx != 0 && kuc[idx - 1] > kuc[idx]){
					idx--;
					swap(kuc[idx], kuc[idx + 1]);
				}
				kc[l] = 1;
			}
			//assert(kuc.size() != sz1);
		}
		return -1;
	}

Compilation message (stderr)

prize.cpp: In function 'int find_best(int)':
prize.cpp:29:8: warning: unused variable 'sz1' [-Wunused-variable]
   29 |    int sz1 = kuc.size();
      |        ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...