Submission #1297500

#TimeUsernameProblemLanguageResultExecution timeMemory
1297500Jawad_Akbar_JJThe Big Prize (IOI17_prize)C++20
0 / 100
1 ms400 KiB
#include <iostream>
#include <vector>
#include "prize.h"

using namespace std;
int tot, Ans = 0;
vector<int> res;

vector<int> Ask(int id){
	res = ask(id);
	if (res[0] + res[1] == 0)
		Ans = id;
	return res;
}

void Solve(int l, int r, int k, int cnt){
	vector<int> rs;
	if (cnt == 0 or l == r)
		return;

	int mid = (l + r) / 2;
	rs = Ask(mid);

	if (rs[0] + rs[1] != tot){
		int m1 = mid + 1;
		while (m1 < r){
			rs = Ask(m1);
			if (rs[0] + rs[1] == tot)
				break;
			m1++;
		}

		if (m1 == r)
			Solve(l, mid, k, cnt - (m1 - mid));
		else
			Solve(l, mid, k, k - rs[1] - (m1 - mid));
		
		Solve(m1, r, rs[1], cnt - (k - rs[1]));
		return;
	}
	
	Solve(l, mid, k, k - rs[1]);
	Solve(mid, r, rs[1], cnt - (k - rs[1]));
}

int find_best(int n){
	srand(time(0));

	if (n <= 150){
		for (int i=0;i<n;i++){
			Ask(i);
			tot = max(tot, res[0] + res[1]);
		}
	}
	else{

		for (int i=1;i<=20;i++){
			int id = rand() % n;
			Ask(id);
			tot = max(tot, res[0] + res[1]);
		}
		int add = n / 180;
		for (int k=1, cur = 0;k<=n;k++, cur+=add){
			int id = rand() % add + cur;
			Ask(id);
			tot = max(tot, res[0] + res[1]);
		}
	}

	Solve(0, n, tot, tot);

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