제출 #1133783

#제출 시각아이디문제언어결과실행 시간메모리
1133783NeltXylophone (JOI18_xylophone)C++17
100 / 100
23 ms1080 KiB
#include "xylophone.h"
#include <bits/stdc++.h>

#define ll long long
#define endl "\n"

using namespace std;
map<pair<ll, ll>, ll> mp;
ll ask(ll i, ll j)
{
	return mp.count({i, j}) ? mp[{i, j}] : mp[{i, j}] = query(i, j);
}
void solve(int n) {
	ll a[n + 1];
	ll l = 1, r = n;
	while (l <= r)
	{
		ll mid = (l + r) >> 1;
		if (ask(mid, n) == n - 1)
			l = mid + 1;
		else
			r = mid - 1;
	}
	l--;
	a[l] = 1;
	if (l + 1 <= n)
		a[l + 1] = ask(l, l + 1) + 1;
	set<ll> s;
	s.insert(1);
	s.insert(a[l + 1]);
	for (ll i = l + 2; i <= n; i++)
	{
		ll x = ask(i - 1, i);
		if (a[i - 1] - x < 1 or s.count(a[i - 1] - x))
		{
			a[i] = a[i - 1] + x;
			continue;
		}
		if (a[i - 1] + x > n or s.count(a[i - 1] + x))
		{
			a[i] = a[i - 1] - x;
			continue;
		}
		ll y = ask(i - 2, i);
		for (ll z : {a[i - 1] - x, a[i - 1] + x})
			if (max({a[i - 2], a[i - 1], z}) - min({a[i - 2], a[i - 1], z}) == y)
				a[i] = z;
		s.insert(a[i]);
	}
	if (l - 1 > 0)
		a[l - 1] = ask(l - 1, l) + 1;
	s.insert(a[l - 1]);
	for (ll i = l - 2; i >= 1; i--)
	{
		ll x = ask(i, i + 1);
		if (a[i + 1] - x < 1 or s.count(a[i + 1] - x))
		{
			a[i] = a[i + 1] + x;
			continue;
		}
		if (a[i + 1] + x > n or s.count(a[i + 1] + x))
		{
			a[i] = a[i + 1] - x;
			continue;
		}
		ll y = ask(i, i + 2);
		for (ll z : {a[i + 1] - x, a[i + 1] + x})
			if (max({a[i + 2], a[i + 1], z}) - min({a[i + 2], a[i + 1], z}) == y)
				a[i] = z;
	}
	// for (ll i = 1; i <= n; i++)
	// 	cout << a[i] << " \n"[i == n];
	for (ll i = 1; i <= n; i++)
		answer(i, a[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...