Submission #790714

#TimeUsernameProblemLanguageResultExecution timeMemory
790714ttamxThe Big Prize (IOI17_prize)C++14
0 / 100
178 ms24084 KiB
#include "prize.h"
#include<bits/stdc++.h>

using namespace std;

mt19937 rng(time(nullptr));

const int N=2e5+5;

struct fenwick{
	int t[N];
	void add(int i,int v){
		i++;
		while(i<N)t[i]+=v,i+=i&-i;
	}
	int read(int i){
		i++;
		int res=0;
		while(i>0)res+=t[i],i-=i&-i;
		return res;
	}
}f;

int cnt=0;
int n;
int ans=-1;
vector<vector<int>> mem(N),mem2(N);
int mx;
vector<int> vec;

vector<int> ask2(int x){
	if(mem[x].empty()){
		assert(++cnt<=1e4);
		mem[x]=mem2[x]=ask(x);
	}
	return mem[x];
}

int bsearch(){
	int l=0,r=vec.size()-1;
	bool left=false;
	while(l<r){
		int mid=(l+r)/2;
		int m=vec[mid];
		auto res=ask2(m);
		int val=res[0]+res[1];
		if(val<mx)return m;
		if(res[0]-f.read(m-1)){
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	return vec[l];
}

int find_best(int _n) {
	n=_n;
	for(int i=0;i<n;i++)vec.emplace_back(i);
	do{
		int x=(rng()%n+n)%n;
		if(lower_bound(vec.begin(),vec.end(),x)==vec.end())continue;
		auto res=ask2(x);
		mx=max(mx,res[0]+res[1]);
		if(mx<n/2){
			if(res[0]+res[1]==0)return x;
			f.add(x,1);
			vec.erase(lower_bound(vec.begin(),vec.end(),x));
		}
	}while(mx<n/2);
	while(ans==-1){
		int x=bsearch();
		auto res=ask2(x);
		if(res[0]+res[1]==0)return x;
		f.add(x,1);
		vec.erase(lower_bound(vec.begin(),vec.end(),x));
	}
	return ans;
}

Compilation message (stderr)

prize.cpp: In function 'int bsearch()':
prize.cpp:41:7: warning: unused variable 'left' [-Wunused-variable]
   41 |  bool left=false;
      |       ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...