Submission #779450

#TimeUsernameProblemLanguageResultExecution timeMemory
779450CSQ31The Big Prize (IOI17_prize)C++17
20 / 100
94 ms12556 KiB
#include "prize.h"
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define sz(a) (int)(a.size())
#define all(a) a.begin(),a.end()
typedef pair<int,int> pii;
int loli = 0;
vector<vector<int>>memo(222222,{-1,-1});
vector<int>res;
void query(int x){
	if(memo[x][0] != -1)return;
	else memo[x] = ask(x);
	res = memo[x];
}
int ans = 0;
void solve(int l,int r,int cntl,int cntr){
	int mid = (l+r)/2,L,R;
	L = R = -1;
	
	for(int i=mid;i>=l;i--){
		query(i);
		if(res[0]+res[1] == 0){
			ans = i;
			return;
		}
		if(res[0]+res[1] != loli)continue;
		L = i;
		break;
	}
	for(int i=mid+1;i<=r;i++){
		query(i);
		if(res[0]+res[1] == 0){
			ans = i;
			return;
		}
		R = i;
		break;
		
	}
	if(L!=-1){
		if(res[0]-cntl){
			solve(l,L-1,cntl,res[1]);
		}
	}
	if(R!=-1){
		if(res[1]-cntr){
			solve(R+1,r,res[0],cntr);
		}
	}
	
}
int find_best(int n) {	
	int p = 0;
	for(int i=0;i<min(n,447);i++){
		query(i);
		if(res[0]+res[1] == 0)return i;
		if(res[0]+res[1] > loli){
			loli = res[0]+res[1];
			p = i;
		}
		if(loli >= 27)break;
	}
	solve(p,n-1,res[0],0);
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...