Submission #56494

#TimeUsernameProblemLanguageResultExecution timeMemory
56494KerimThe Big Prize (IOI17_prize)C++17
90 / 100
107 ms5600 KiB
#include "bits/stdc++.h"
#include "prize.h"
#define MAXN 200009
#define INF 1000000007
#define mp(x,y) make_pair(x,y)
#define all(v) v.begin(),v.end()
#define pb(x) push_back(x)
#define wr cout<<"----------------"<<endl;
#define ppb() pop_back()
#define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++)
#define ff first
#define ss second
#define my_little_dodge 46
#define debug(x)  cerr<< #x <<" = "<< x<<endl;
#define left cep
#define right sag
using namespace std;

typedef long long ll;
typedef pair<int,int> PII;
template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;}
template<class T>bool umax(T& a,T b){if(a<=b){a=b;return 1;}return 0;}
int n;
const int c=480;
//~ int arr[MAXN],query=0;
//~ int left[MAXN],right[MAXN],cnt[123];
//~ vector<int>ask(int x){
	//~ query++;
	//~ vector<int>res(2,0);
	//~ assert(res[0]+res[1]==0);
	//~ res[0]=left[x];
	//~ res[1]=right[x];
	//~ return res;	
//~ }
vector<int>memo[MAXN];
vector<int>sora(int x){
	if(!memo[x].empty())
		return memo[x];
	return memo[x]=ask(x);
}
int find_best(int N){
	n=N;
	int mx=0;
	vector<int>res,tmp;
	for(int i=0;i<min(n,c);i++){
		res=sora(i);
		if(res[0]+res[1]==0)
			return i;
		umax(mx,res[0]+res[1]);
	}
	for(int i=c;i<n;i+=c){
		int who=i;
		if(sora(who)==sora(min(n-1,i+c-1)))
			continue;
		while(who<min(n,i+c)){
			tmp=sora(who);
			if(tmp[0]+tmp[1]==0)
				return who;
			if(tmp[0]+tmp[1]<mx){
				who++;
				continue;
			}	
			int st=who+1,en=min(n-1,i+c-1),pos=who;
			while(st<=en){
				int mid=(st+en)/2;
				res=sora(mid);
				if(res!=tmp)
					en=mid-1;
				else{
					pos=mid;
					st=mid+1;
				}	
			}
			who=pos+1;
		}
	}
	return -1;
}
//~ int main(){
    //~ freopen("file.in", "r", stdin);
    //~ int N;
    //~ scanf("%d",&N);
    //~ for(int i=0;i<N;i++)
		//~ scanf("%d",arr+i);
	//~ for(int i=0;i<N;i++){
		//~ for(int j=1;j<arr[i];j++)
			//~ left[i]+=cnt[j];
		//~ cnt[arr[i]]++;	
	//~ }	
	//~ memset(cnt,0,sizeof cnt);
	//~ for(int i=N-1;i>=0;i--){
		//~ for(int j=1;j<arr[i];j++)
			//~ right[i]+=cnt[j];
		//~ cnt[arr[i]]++;	
	//~ }
	//~ int ans=find_best(N);
	//~ assert(arr[ans]==1);
	//~ printf("%d\n",ans);	
	//~ debug(query);
	//~ return 0;
//~ }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...