Submission #1306894

#TimeUsernameProblemLanguageResultExecution timeMemory
1306894teamcuddlepieXylophone (JOI18_xylophone)C++20
100 / 100
19 ms444 KiB
#include "xylophone.h" #include <bits/stdc++.h> using namespace std; void solve(int N) { vector<int> a(N + 1, 0); vector<bool> used(N + 1, false); // 1. Find position of 1 using binary search int low = 1, high = N, pos1 = 1; while (low <= high) { int mid = (low + high) / 2; if (mid == N) break; // Avoid query(N, N) if unnecessary if (query(mid, N) == N - 1) { pos1 = mid; low = mid + 1; } else { high = mid - 1; } } auto determine = [&](int cur, int prev, int pprev) { int d1 = query(min(cur, prev), max(cur, prev)); int c1 = a[prev] + d1; int c2 = a[prev] - d1; // Validation against bounds and used numbers if (c1 < 1 || c1 > N || used[c1]) return c2; if (c2 < 1 || c2 > N || used[c2]) return c1; // Tie-breaker using query(i-2, i) int d2 = query(min(cur, pprev), max(cur, pprev)); if (max({a[prev], a[pprev], c1}) - min({a[prev], a[pprev], c1}) == d2) { return c1; } return c2; }; // Initialize 1 a[pos1] = 1; used[1] = true; // 2. Solve Right if (pos1 < N) { a[pos1 + 1] = 1 + query(pos1, pos1 + 1); used[a[pos1 + 1]] = true; for (int i = pos1 + 2; i <= N; i++) { a[i] = determine(i, i - 1, i - 2); used[a[i]] = true; } } // 3. Solve Left if (pos1 > 1) { a[pos1 - 1] = 1 + query(pos1 - 1, pos1); used[a[pos1 - 1]] = true; for (int i = pos1 - 2; i >= 1; i--) { a[i] = determine(i, i + 1, i + 2); used[a[i]] = true; } } for (int 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...