Submission #977393

#TimeUsernameProblemLanguageResultExecution timeMemory
977393mariaclaraThe Big Prize (IOI17_prize)C++17
90 / 100
55 ms2388 KiB
#include "prize.h"
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second

int lolipop;
vector<pii> resp;

int a(int x) {
	if(resp[x].fr != -1) return resp[x].fr;
	vector<int> aux = ask(x);
	resp[x] = {aux[0], aux[1]};
	return resp[x].fr;
}

int b(int x) {
	if(resp[x].sc != -1) return resp[x].sc;
	vector<int> aux = ask(x);
	resp[x] = {aux[0], aux[1]};
	return resp[x].sc;
}

int query(int l, int r) {
	while(l < r and a(l) + b(l) != lolipop) {
		if(a(l) + b(l) == 0) return l;
		l++;
	}

	while(l < r and a(r) + b(r) != lolipop) {
		if(a(r) + b(r) == 0) return r;
		r--;
	}

	if(l > r or a(l) == a(r)) return -1; // checo se o intervalo é valido e se existe um valor diferente de lolipop nele

	int mid = (l+r)/2;
	return max(query(l,mid), query(mid+1,r));
}
int find_best(int n) {
	resp.resize(n, mk(-1,-1));

	for(int i = 0; i < min(500,n); i++) lolipop = max(lolipop, a(i) + b(i));

	return query(0, n-1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...