제출 #1352255

#제출 시각아이디문제언어결과실행 시간메모리
1352255KALARRYThe Big Prize (IOI17_prize)C++20
100 / 100
9 ms1952 KiB
//chockolateman

#include<bits/stdc++.h>
#include "prize.h"

using namespace std;

int least_expensive = 0;
pair<int,int> memo[200005];

pair<int,int> my_ask(int i)
{
	if(memo[i].first == -1)
	{
		vector<int> temp = ask(i);
		memo[i] = {temp[0],temp[1]};
	}
	return memo[i];
}

int search(int start,int end,int prv = 0,int nxt = 0)
{
    if(start > end)
        return -1;
	int mid = (start + end)/2;
	int l = -1,r = -1;
	pair<int,int> cur = my_ask(mid);
	if(cur.first + cur.second == 0)
		return mid;
	while(mid > start && cur.first + cur.second < least_expensive)
	{
		if(cur.first + cur.second == 0)
			return mid;
		mid--;
		cur = my_ask(mid);
	}
	if(cur.first > prv)
		l = search(start,mid-1,prv,cur.second);
	mid = (start + end)/2;
	cur = my_ask(mid);
	while(mid < end && cur.first + cur.second < least_expensive)
	{
		if(cur.first + cur.second == 0)
			return mid;
		mid++;
		cur = my_ask(mid);
	}
	if(cur.second > nxt)
		r = search(mid+1,end,cur.first,nxt);
    return max(l,r);
}

int find_best(int n) 
{
	for(int i = 0 ; i < n ; i++)
		memo[i] = {-1,-1};
	pair<int,int> temp;
	for(int i = 0 ; i < min(200,n) ; i++)
	{
		temp = my_ask(i);
		least_expensive = max(least_expensive,temp.first + temp.second);
	}
	return search(0,n-1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...