Submission #389056

#TimeUsernameProblemLanguageResultExecution timeMemory
389056prvocisloGap (APIO16_gap)C++17
49.72 / 100
109 ms7784 KiB
#include "gap.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <iomanip>
typedef long long ll;
using namespace std;

// MinMax(, , &, &);
ll best;
void upd(ll x)
{
	best = max(best, x);
}
long long findGap1(int N)
{
	ll mini = -1, maxi = 1e18 + 79;
	vector<ll> v(N);
	for (int l = 0, r = N - 1; l <= r; l++, r--)
	{
		mini++, maxi--;
		MinMax(mini, maxi, &mini, &maxi);
		v[l] = mini;
		v[r] = maxi;
	}
	ll ans = 0;
	for (int i = 0; i < N - 1; i++) ans = max(ans, v[i + 1] - v[i]);
	return ans;
}
long long findGap(int T, int N)
{
	if (T == 1)return findGap1(N);
	ll mini = -1, maxi = 1e18; best = 1;
	set<ll> s;
	set<pair<ll, pair<ll, ll> >, greater<pair<ll, pair<ll, ll> >> > pq;
	MinMax(mini, maxi, &mini, &maxi);
	s.insert({ mini, maxi });
	pq.insert({ maxi - mini, {mini, maxi} });
	while (!pq.empty())
	{
		ll dist = pq.begin()->first;
		if (dist <= best) return best;
		mini = pq.begin()->second.first;
		maxi = pq.begin()->second.second;
		if (mini + 1 == maxi) break;
		if (mini + 2 == maxi)
		{
			ll a;
			MinMax(mini + 1, maxi - 1, &a, &a);
			if (a == -1) upd(2);
			else upd(1);
			break;
		}
		pq.erase(pq.begin());
		ll m1 = (mini + maxi) / 2, m2 = (mini + maxi) / 2 + 1;
		ll mi1, mx1, mi2, mx2;
		MinMax(mini + 1, m1, &mi1, &mx1);
		MinMax(m2, maxi - 1, &mi2, &mx2);
		if (mi1 != -1) s.insert(mi1), s.insert(mx1);
		if (mi2 != -1) s.insert(mi2), s.insert(mx2);
		upd(*next(s.find(mini)) - mini);
		upd(maxi - *prev(s.find(maxi)));
		if (mx1 != -1 && mi2 != -1) upd(mi2 - mx1);
		pq.insert({ mx1 - mi1, {mi1, mx1} });
		pq.insert({ mx2 - mi2, {mi2, mx2} });
	}
	return best;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...