Submission #677136

#TimeUsernameProblemLanguageResultExecution timeMemory
677136borisAngelovXylophone (JOI18_xylophone)C++17
0 / 100
0 ms296 KiB
#include <iostream> #include <math.h> #include "xylophone.h" using namespace std; const int maxn = 5005; int p[maxn]; bool appeared[maxn]; void solve(int n) { for (int i = 1; i <= n; ++i) { appeared[i] = false; } int l = 1; int r = n; while (l <= r) { int mid = (l + r) >> 1; if (query(1, mid) == n - 1) r = mid - 1; else l = mid + 1; } int pos_n = l; p[pos_n] = n; appeared[n] = true; p[pos_n - 1] = p[pos_n] - query(pos_n - 1, pos_n); appeared[p[pos_n - 1]] = true; if (pos_n != n) { p[pos_n + 1] = p[pos_n] - query(pos_n, pos_n + 1); appeared[p[pos_n + 1]] = true; } for (int i = pos_n - 2; i >= 1; --i) { int x = query(i, i + 1); if (p[i + 1] + x > n) { p[i] = p[i + 1] - x; appeared[p[i]] = true; continue; } if (p[i + 1] - x <= 0) { p[i] = p[i + 1] + x; appeared[p[i]] = true; continue; } if (appeared[p[i + 1] + x] == true) { p[i] = p[i + 1] - x; appeared[p[i]] = true; continue; } if (appeared[p[i + 1] - x] == true) { p[i] = p[i + 1] + x; appeared[p[i]] = true; continue; } int y = abs(p[i + 1] - p[i + 2]); int z = query(i, i + 2); if (z == x + y) { if (p[i + 2] > p[i + 1]) { p[i] = p[i + 1] - x; appeared[p[i]] = true; } else { p[i] = p[i + 1] + x; appeared[p[i]] = true; } } else { if (p[i + 1] > p[i + 2]) { p[i] = p[i + 1] - x; appeared[p[i]] = true; } else { p[i] = p[i + 1] + x; appeared[p[i]] = true; } } } for (int i = pos_n + 2; i <= n; ++i) { int x = query(i - 1, i); if (p[i - 1] + x > n) { p[i] = p[i - 1] - x; appeared[p[i]] = true; continue; } if (p[i - 1] - x <= 0) { p[i] = p[i - 1] + x; appeared[p[i]] = true; continue; } if (appeared[p[i - 1] + x] == true) { p[i] = p[i - 1] - x; appeared[p[i]] = true; continue; } if (appeared[p[i - 1] - x] == true) { p[i] = p[i - 1] + x; appeared[p[i]] = true; continue; } int y = abs(p[i - 1] - p[i - 2]); int z = query(i - 2, i); if (z == x + y) { if (p[i - 2] > p[i - 1]) { p[i] = p[i - 1] - x; appeared[p[i]] = true; } else { p[i] = p[i - 1] + x; appeared[p[i]] = true; } } else { if (p[i - 1] > p[i - 2]) { p[i] = p[i - 1] - x; appeared[p[i]] = true; } else { p[i] = p[i - 1] + x; appeared[p[i]] = true; } } } for (int i = 1; i <= n; ++i) { cout << p[i] << " "; } cout << endl; for (int i = 1; i <= n; ++i) { answer(i, p[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...