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...