Submission #523818

#TimeUsernameProblemLanguageResultExecution timeMemory
523818valerikkGap (APIO16_gap)C++17
100 / 100
66 ms4184 KiB
#include "gap.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll INF = (ll)1e18;

ll MN, MX;

pair<ll, ll> get(ll l, ll r) {
	MinMax(l, r, &MN, &MX);
	return {MN, MX};
}

ll findGap(int t, int n) {
	if (t == 1) {
		vector<ll> lft, rght;
		ll l = 0, r = INF;
		for (int i = 0; i < (n + 1) / 2; ++i) {
			auto [L, R] = get(l, r);
			lft.push_back(L);
			if (L != R) rght.push_back(R);
			l = L + 1;
			r = R - 1;
		}
		while (!rght.empty()) {
			lft.push_back(rght.back());
			rght.pop_back();
		}
		ll res = 0;
		for (int i = 1; i < (int)lft.size(); ++i) {
			//assert(lft[i - 1] < lft[i]);
			res = max(res, lft[i] - lft[i - 1]);
		}
		return res;
	}
	if (t == 2) {
		auto [l, r] = get(0, INF);
		ll d = (r - l + n - 2) / (n - 1);
		ll res = d;
		vector<pair<ll, ll>> segs;
		ll cur = l;
		while (cur <= r) {
			segs.push_back({cur, min(r, cur + d)});
			cur = cur + d + 1;
		}
		vector<ll> mx(segs.size()), mn(segs.size());
		for (int i = 0; i < (int)segs.size(); ++i) {
			auto [L, R] = get(segs[i].first, segs[i].second);
			mx[i] = R;
			mn[i] = L == -1 ? INF + 1 : L;
		}
		for (int i = 1; i < (int)segs.size(); ++i) {
			mx[i] = max(mx[i], mx[i - 1]);
		}
		for (int i = (int)segs.size() - 2; i >= 0; --i) {
			mn[i] = min(mn[i], mn[i + 1]);
		}
		for (int i = 1; i < (int)segs.size(); ++i) {
			if (mx[i - 1] != -1 && mn[i] != INF + 1) {
				res = max(res, mn[i] - mx[i - 1]);
			}
		}
		return res;
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...