Submission #1147692

#TimeUsernameProblemLanguageResultExecution timeMemory
1147692gygThe Big Prize (IOI17_prize)C++20
90 / 100
236 ms2620 KiB
// ZERO INDEXING

#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
#define sig signed
#define int long long
#define vec vector 
#define pii pair<int, int>
#define fir first 
#define sec second

int n;

map<int, pii> rsp;
pii qry(int i) {
	if (rsp.count(i)) return rsp[i];
	vec<sig> ans = ask(i);
	rsp[i] = {ans[0], ans[1]};
	return rsp[i];
}

int gd;
void gd_cmp() {
	for (int i = 0; i < min(500ll, n); i++)
		gd = max(gd, qry(i).fir + qry(i).sec);
}

vec<int> lst;
int cnt(int x) {
	int ans = 0;
	for (int y : lst) ans += (y <= x);
	return ans;
}
int srch(vec<int>& rm) {
	int lw = 0, hg = rm.size() - 1;
	while (lw < hg) {
		int md = (lw + hg) / 2;
		if (qry(rm[md]).fir + qry(rm[md]).sec != gd) return md;
		if (qry(rm[md]).fir - cnt(rm[md])) hg = md - 1;
		else lw = md + 1;
	}
	return lw;
}

void lst_cmp() {
	vec<int> rm;
	for (int i = 0; i < n; i++) rm.push_back(i);
	for (int x = 0; x < gd; x++) {
		int i = srch(rm);
		lst.push_back(rm[i]);
		rm.erase(rm.begin() + i);
	}
}

int ans_cmp() {
	for (int i : lst) 
		if (qry(i).fir + qry(i).sec == 0) return i;
	assert(false); return -1;
}

sig find_best(sig _n) {
	n = _n;

	gd_cmp();
	lst_cmp();
	int ans = ans_cmp();

	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...