Submission #1222978

#TimeUsernameProblemLanguageResultExecution timeMemory
1222978AmirAli_H1The Big Prize (IOI17_prize)C++17
100 / 100
13 ms3552 KiB
// In the name of Allah

#include <bits/stdc++.h>
#include "prize.h"
using namespace std;

typedef		long long int			ll;
typedef		long double				ld;
typedef		pair<int, int>			pii;
typedef		pair<ll, ll>			pll;
typedef		complex<ld>				cld;

#define		all(x)					(x).begin(),(x).end()
#define		len(x)					((ll) (x).size())
#define		F						first
#define		S						second
#define		pb						push_back
#define		sep						' '
#define		endl					'\n'
#define		Mp						make_pair
#define		kill(x)					cout << x << '\n', exit(0)
#define		set_dec(x)				cout << fixed << setprecision(x);
#define		file_io(x,y)			freopen(x, "r", stdin); freopen(y, "w", stdout);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int maxn = 2e5 + 4;
const int SR = 200;
const int limit = 1e4;

int n, fx[maxn], Qt;
int M[maxn]; pii valx[maxn];
vector<int> vc; int mx;

void askx(int i) {
	if (M[i]) return ;
	if (Qt + 1 > limit) exit(23);
	M[i] = 1; vector<int> res = ask(i); Qt++;
	valx[i].F = res[0]; valx[i].S = res[1];
	fx[i] = ((valx[i].F + valx[i].S) >= mx);
}

int solvex(int l, int r, int R) {
	if (l >= r) return 0;
	if (r - l == 1) {
		int j = r - 1; askx(j);
		if (valx[j].F + valx[j].S > mx) {
			mx = valx[j].F + valx[j].S;
			return -1;
		}
		if (!fx[j]) return 1;
		else return 0;
	}
	int j = r - 1; askx(j);
	if (valx[j].F + valx[j].S > mx) {
		mx = valx[j].F + valx[j].S;
		return -1;
	}
	if (!fx[j]) {
		int Rx = solvex(l, r - 1, R);
		if (Rx == -1) return -1;
		return 1 + Rx;
	}
	if (valx[j].F == R) return 0;
	int mid = (l + r) / 2;
	int R1 = solvex(l, mid, R);
	if (R1 == -1) return -1;
	int R2 = solvex(mid, r, R + R1);
	if (R2 == -1) return -1;
	return R1 + R2;
}

void solvef() {
	int R = 0;
	for (int i = 0; i < n; i++) {
		if (!M[i]) fx[i] = 0;
		else fx[i] = ((valx[i].F + valx[i].S) >= mx);
	}
	for (int i = 0; i < n; i += SR) {
		int x = solvex(i, min(n, i + SR), R);
		if (x == -1) {
			solvef();
			return ;
		}
		R += x;
	}
}

int find_best(int nx) {
	n = nx;
	mx = 0; solvef();
	for (int i = 0; i < n; i++) {
		if (!M[i]) continue;
		if (valx[i].F + valx[i].S == 0) return i;
	}
	return -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...