Submission #1282034

#TimeUsernameProblemLanguageResultExecution timeMemory
1282034KickingKunXylophone (JOI18_xylophone)C++20
100 / 100
30 ms20680 KiB
#include "xylophone.h"

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

int ask[5001][5001];

int delta(int l, int r) {
	if (ask[l][r] != 0) return ask[l][r];
	return ask[l][r] = query(l, r);
}

void solve(int N) {
	int posN = N, l = 2, r = N - 1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (delta(1, mid) == N - 1) r = (posN = mid) - 1;
		else l = mid + 1;
	}

	vector <int> ans(N + 1);
	vector <bool> mark(N + 1);

	auto valid = [&] (int x) {
		return x > 0 && x <= N && !mark[x];
	};

	ans[posN] = N; mark[N] = true;
	for (int i = posN - 1; i > 0; i--) {
		int d = delta(i, i + 1);
		if (!valid(ans[i + 1] - d)) ans[i] = ans[i + 1] + d;
		else if (!valid(ans[i + 1] + d)) ans[i] = ans[i + 1] - d;
		else {
			if (delta(i, i + 2) == abs(ans[i + 2] - ans[i + 1])) {
				// min(b, c) <= a <= max(b, c)
				if (ans[i + 1] < ans[i + 2]) ans[i] = ans[i + 1] + d;
				else ans[i] = ans[i + 1] - d; 
			}
			else {
				if (ans[i + 1] < ans[i + 2]) {
					if (d == delta(i, i + 2)) ans[i] = ans[i + 1] + d;
					else ans[i] = ans[i + 1] - d;
				}
				else {
					if (d == delta(i, i + 2)) ans[i] = ans[i + 1] - d;
					else ans[i] = ans[i + 1] + d;
				}
			}
		}
		mark[ans[i]] = true;
	}

	for (int i = posN + 1; i <= N; i++) {
		int d = delta(i - 1, i);
		if (!valid(ans[i - 1] - d)) ans[i] = ans[i - 1] + d;
		else if (!valid(ans[i - 1] + d)) ans[i] = ans[i - 1] - d;
		else {
			if (delta(i - 2, i) == abs(ans[i - 2] - ans[i - 1])) {
				if (ans[i - 1] < ans[i - 2]) ans[i] = ans[i - 1] + d;
				else ans[i] = ans[i - 1] - d;
			}
			else {
				if (ans[i - 1] < ans[i - 2]) {
					if (d == delta(i - 2, i)) ans[i] = ans[i - 1] + d;
					else ans[i] = ans[i - 1] - d;
				}
				else {
					if (d == delta(i - 2, i)) ans[i] = ans[i - 1] - d;
					else ans[i] = ans[i - 1] + d;
				}
			}
		}
		mark[ans[i]] = true;
	}

	for (int i = 1; i <= N; i++) 
		answer(i, ans[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...