#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 = 2, l = 3, r = N;
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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |