Submission #1130676

#TimeUsernameProblemLanguageResultExecution timeMemory
1130676OI_AccountGap (APIO16_gap)C++20
100 / 100
43 ms4152 KiB
#include "gap.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 100'000;
const ll INF = 1'000'000'000'000'000'000;

ll n, t, a[N + 10];

void readInput(int x, int y) {
	t = x;
	n = y;
}

pair<ll, ll> ask(ll s, ll t) {
	ll a, b;
	MinMax(s, t, &a, &b);
	return {a, b};
}

ll calcMax() {
	ll mx = 0;
	for (int i = 1; i < n; i++)
		mx = max(mx, a[i + 1] - a[i]);
	return mx;
}

ll solve1() {
	ll x = 0, y = INF;
	for (int i = 1, j = n; i <= j; i++, j--) {
		pair<ll, ll> p = ask(x, y);
		x = p.first;
		y = p.second;
		a[i] = x;
		a[j] = y;
		x++;
		y--;
		//cout << i << ' ' << j << ": " << x << ' ' << y << endl;
	}
	return calcMax();
}

ll solve2() {
	pair<ll, ll> p = ask(0, INF);
	ll mn = p.first, mx = p.second;
	ll len = mx - mn + 1;
	vector<ll> vec;
	for (int i = 0; i < len % n; i++)
		vec.push_back((len + n - 1) / n);
	while (vec.size() < n)
		vec.push_back(len / n);
	vector<pair<ll, ll>> all;
	ll pnt = mn;
	for (int i = 0; i < vec.size(); i++) {
		pair<ll, ll> tmp;
		if (i == 0) {
			if (vec[i] == 1)
				tmp = {mn, mn};
			else {
				pair<ll, ll> p = ask(pnt + 1, pnt + vec[i] - 1);
				if (p.second == -1)
					tmp = {mn, mn};
				else
					tmp = {mn, p.second};
			}
		}
		else
			tmp = ask(pnt, pnt + vec[i] - 1);
		if (tmp.first != -1)
			all.push_back(tmp);
		pnt += vec[i];
	}
	ll ans = 0;
	for (int i = 1; i < all.size(); i++)
		ans = max(ans, all[i].first - all[i - 1].second);
	return ans;
}

ll solve() {
	if (t == 1)
		return solve1();
	return solve2();
}

long long findGap(int T, int N) {
	readInput(T, N);
	return solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...