제출 #72509

#제출 시각아이디문제언어결과실행 시간메모리
72509Kmcode커다란 상품 (IOI17_prize)C++14
100 / 100
69 ms956 KiB
#include<bits/stdc++.h>
using namespace std;

//#include "prize.h"

#include <vector>

int find_best(int n);
std::vector<int> ask(int i);

namespace solver{
	map<int,pair<int,int> > mp;
	int fin;
	
	pair<int,int> query(int box){
		if(box==-1){
			return make_pair(0,-111);
		}
		if(mp.count(box))return mp[box];
		auto z=ask(box);
		if(z[0]==0&&z[1]==0){
			fin=box;
		}
		return mp[box]=make_pair(z[0],z[1]);
	}
	int mx;
	inline void dfs(int l,int r){
		int r_cn=query(r-1).first+query(r-1).second;
		int l_cn=query(l-1).first+query(l-1).second;
		mx=max(mx,r_cn);
		mx=max(mx,l_cn);
		if(r_cn==l_cn&&query(l-1).first==query(r-1).first)return;
		if(r_cn>l_cn&&query(l-1).first==query(r-1).first)return;
		while(r>l&&r_cn!=mx&&fin==-1){
			r--;
			if(l>=r){
				query(l);
				return;
			}
			r_cn=query(r-1).first+query(r-1).second;
			if(r_cn==l_cn&&query(l-1).first==query(r-1).first)return;
			if(r_cn>l_cn&&query(l-1).first==query(r-1).first)return;
			mx=max(mx,r_cn);
		}
		while(r>l&&l_cn!=mx&&fin==-1){
			l++;
			if(l>=r){
				query(r-1);
				return;
			}
			l_cn=query(l-1).first+query(l-1).second;
			if(r_cn==l_cn&&query(l-1).first==query(r-1).first)return;
			if(r_cn>l_cn&&query(l-1).first==query(r-1).first)return;
			mx=max(mx,l_cn);
		}
		if(r<=l)return;
		if(fin!=-1)return;
		if(r_cn==l_cn&&query(l-1).first==query(r-1).first)return;
		if(r_cn>l_cn&&query(l-1).first==query(r-1).first)return;
		if(query(r-1).first==0)return;
		if(l+1==r)return;
		if(fin!=-1)return;
		dfs(l,(l+r)>>1);
		if(fin!=-1)return;
		dfs((l+r)>>1,r);
	}
	int find_best(int n) {
		fin=-1;
		dfs(0,n);
		return fin;
	}
}

int find_best(int n) {
	return solver::find_best(n);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...