Submission #797521

#TimeUsernameProblemLanguageResultExecution timeMemory
797521alvingogo커다란 상품 (IOI17_prize)C++14
96.36 / 100
51 ms1140 KiB
#include "prize.h"
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

map<int,vector<int> > m;
int c=0,k=0;
vector<int> query(int x){
	if(m.find(x)==m.end()){
		m[x]=ask(x);
		if(m[x][0]+m[x][1]==k){
			c++;
		}
		else{
		}
		return m[x];
	}
	return m[x];
}
mt19937 rnd(43243214);
int find_best(int n) {
	if(n<=5000){
		for(int i=0;i<n;i++){
			auto h=query(i);
			if(h[0]==0 && h[1]==0){
				return i;
			}
		}
	}
	set<int> p;
	for(int i=0;i<500;i++){
		int x=rnd()%n;
		while(p.find(x)!=p.end()){
			x=rnd()%n;
		}
		p.insert(x);
		k=max(k,query(x)[0]+query(x)[1]);
	}
	m[-1]={0,k};
	m[n]={k,0};
	set<int> s;
	queue<pair<int,int> > q;
	q.push({-1,n});
	while(q.size()){
		auto h=q.front();
		q.pop();
		if(query(h.fs)==query(h.sc)){
			continue;
		}
		int x=(h.fs+h.sc)/2;
		int flag=0;
		for(int i=x;i>h.fs;i--){
			auto y=query(i);
			if(y[0]+y[1]==k){
				q.push({i,h.sc});
				q.push({h.fs,i});
				flag=1;
				break;
			}
			else{
				s.insert(i);
			}
		}
		if(flag==0){
			for(int i=x+1;i<h.sc;i++){
				auto y=query(i);
				if(y[0]+y[1]==k){
					q.push({i,h.sc});
					flag=1;
					break;
				}
				else{
					s.insert(i);
				}
			}
		}
	}
	for(auto h:s){
		if(query(h)[0]==0 && query(h)[1]==0){
			return h;
		}
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...