Submission #1311733

#TimeUsernameProblemLanguageResultExecution timeMemory
1311733madamadam3Xylophone (JOI18_xylophone)C++20
0 / 100
1 ms332 KiB
#include "xylophone.h" #include <bits/stdc++.h> using namespace std; static int A[5000]; void solve(int N) { int value = query(1, N); int L = 1, R = N; int lo = 1, hi = N; while (lo < hi) { int mid = lo + (hi - lo) / 2; if (query(1, mid) == value) { hi = mid; } else { lo = mid + 1; } } R = lo; lo = 1, hi = N; while (lo < hi) { int mid = lo + (hi - lo + 1) / 2; if (query(mid, N) == value) { lo = mid; } else { hi = mid - 1; } } L = lo; cerr << "L: " << L << " R: " << R << "\n"; vector<int> ans(N+1, -1); ans[L] = 1; ans[R] = N; for (int i = L+1; i < R; i++) { if (i == L+1) { ans[i] = 1 + query(L, i); } else { int dx = query(i-1, i), dy = query(i-2, i); int a = ans[i-1] + dx, b = ans[i-1] - dx; int x = ans[i-2], y = ans[i-1]; if (a <= 1 || a >= N) ans[i] = b; else if (b <= 1 || b >= N) ans[i] = a; else if (x < y && dy == a-x) ans[i] = a; else if (x > y && dy == x-y) ans[i] = a; else if (x < y && dy == y-x) ans[i] = b; else if (x > y && dy == x-b) ans[i] = b; } } for (int i = L-1; i >= 1; i--) { if (i == L-1) { ans[i] = 1 + query(i, L); } else { int dx = query(i, i+1), dy = query(i, i+2); int a = ans[i+1] + dx, b = ans[i+1] - dx; int x = ans[i+2], y = ans[i+1]; if (a <= 1 || a >= N) ans[i] = b; else if (b <= 1 || b >= N) ans[i] = a; else if (x < y && dy == a-x) ans[i] = a; else if (x > y && dy == x-y) ans[i] = a; else if (x < y && dy == y-x) ans[i] = b; else if (x > y && dy == x-b) ans[i] = b; } } for (int i = R+1; i <= N; i++) { if (i == R+1) { ans[i] = N - query(R, i); } else { int dx = query(i-1, i), dy = query(i-2, i); int a = ans[i-1] + dx, b = ans[i-1] - dx; int x = ans[i-2], y = ans[i-1]; if (a <= 1 || a >= N) ans[i] = b; else if (b <= 1 || b >= N) ans[i] = a; else if (x < y && dy == a-x) ans[i] = a; else if (x > y && dy == x-y) ans[i] = a; else if (x < y && dy == y-x) ans[i] = b; else if (x > y && dy == x-b) ans[i] = b; } } // for (int i = 1; i <= N; i++) cerr << ans[i] << " "; // cerr << "\n"; 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...