제출 #779368

#제출 시각아이디문제언어결과실행 시간메모리
779368CSQ31커다란 상품 (IOI17_prize)C++17
20 / 100
84 ms10520 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
int num = 0;
#define sz(a) (int)(a.size());
vector<int>res[200000];
int cnt = 0;
vector<int> askk(int v){
	cnt++;
	assert(cnt<=9999);
	return ask(v);
}
int solve(int l,int r,int lf = 0,int rg = 0){
	cerr<<l<<" "<<r<<'\n';
	if(l > r)return -1;
	int mid = (l+r)/2;
	int il = mid;
	int ir = mid;
	int cur = mid;
	for(int i=0;i<=r-l+1;i++){
		if(cur < l || cur > r)break;
		res[cur] = askk(cur);
		if(!res[cur][0] && !res[cur][1])return cur;
		else if(res[cur][0]+res[cur][1] == num)break;
		if(i%2 == 0){
			ir++;
			cur = ir;
		}else{
			il--;
			cur = il;
		}
	}
	cerr<<cur<<'\n';
	if(cur < l || cur > r)return -1;
	if(il-1 >= l && res[il][0]-lf > 0){
	    int c = solve(l,il-1,lf,res[il][1]);
	    if(c!=-1)return c;
	}
	if(ir+1<=r && res[ir][1] - rg > 0){
		int c = solve(ir+1,r,res[ir][0],rg);
		if(c!=-1)return c;
	}
	return -1;
		
}
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
int find_best(int n) {
	if(n<=5000){
		for(int i=0;i<n;i++){
			vector<int>res = ask(i);
			if(res[0] == 0 && res[1] == 0)return i;
		}
		
	}
	int p = 0;
	for(int i=0;i<min(n,(int)(sqrt(n)+30)) && num < 22;i++){
		vector<int>res = ask(i);
		if(!res[0] && !res[1])return i;
		if(res[0]  + res[1] > num){
			num = res[0] + res[1];
			p = i;
		}
	}
	//d&c to try all small guys since < #small guys < sqrt(n)
	return solve(p,n-1,p,0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...