제출 #104238

#제출 시각아이디문제언어결과실행 시간메모리
104238RockyB커다란 상품 (IOI17_prize)C++17
90 / 100
88 ms5632 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
#define oo 2000000000
bool asked[N];
vector<int> answer[N] , v;
vector< pair<int,int> > v2;
int mx = 0 ;
 
vector<int> get(int i){
	if(asked[i])
		return answer[i];
	asked[i] = true;
	answer[i] = ask(i);
	if(answer[i][0] + answer[i][1] == mx) v2.push_back(make_pair(answer[i][0],i)); else v.push_back(i);
	return answer[i];
}
 
int solve(int s,int e){
	int res = e;
	vector<int> v1 = get(s);
	while(e >= s){
		int mid = (s + e) / 2;
		vector<int> cur = get(mid);
		if(cur[0] + cur[1] == mx && cur[0] == v1[0])
			s = mid + 1;
		else {
			res = mid;
			e = mid - 1;
		}
	}
	return res;
}
 
int find_best(int n) {
	int num = sqrt(n) - 2;
	int it = 0;
	if(n <= 5000){
		for(int i=0;i<n;i++){
			vector<int> cur = get(i);
			if(cur[0]+cur[1] == 0) return i;
		}
	}
	for(int i=0;i<n && it < 480;i+=num){
		vector<int> res = get(i);
		int cur = res[0] + res[1];
		mx = max(mx,cur);
		it++;
	}
	for(int i=1;i<n && it < 480;i+=num){
		it++;
		vector<int> res = get(i);
		int cur = res[0] + res[1];
		mx = max(mx,cur);
	}
	int low = 0;
	while(true){
		int high = n - 1;
		vector<int> cur = get(low);
		if(cur[0] + cur[1] == 0) return low;
		if(cur[0] + cur[1] != mx){
			low++;
			continue;
		}
		low = solve(low,high);
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...