Submission #797501

#TimeUsernameProblemLanguageResultExecution timeMemory
797501alvingogoThe Big Prize (IOI17_prize)C++14
20 / 100
80 ms748 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;
vector<int> query(int x){
	if(m.find(x)==m.end()){
		return m[x]=ask(x);
	}
	return m[x];
}
int find_best(int n) {
	int k=0;
	for(int i=0;i<min(n,500);i++){
		auto q=ask(i);
		k=max(k,q[0]+q[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=ask(i);
			if(y[0]+y[1]==k){
				q.push({x,h.sc});
				q.push({h.fs,i});
				flag=1;
				break;
			}
			else{
				assert(s.find(i)==s.end());
				s.insert(i);
			}
		}
		if(flag==0){
			for(int i=x+1;i<h.sc;i++){
				auto y=ask(i);
				if(y[0]+y[1]==k){
					q.push({i,h.sc});
					flag=1;
					break;
				}
				else{
					assert(s.find(i)==s.end());
					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...