# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
763302 | 2023-06-22T07:56:49 Z | vjudge1 | Xylophone (JOI18_xylophone) | C++14 | 0 ms | 0 KB |
#include <bits/stdc++.h> using namespace std; const int N = 5003; int ans[N]; vector <int> w; void solve(int n){ w.push_back(1); w.push_back(n+1); int l = 1, r = n; while(l < r){ int mid = (l+r)/2; int x = query(1, mid); if (x == (n-1)){ r = mid; } else { l = mid+1; } } ans[l] = n; w.push_back(l); l = 1, r = n; while(l < r){ int mid = (l+r)/2; int x = query(mid, n); if (x == (n-1)){ l = mid; } else { r = mid-1; } } ans[l] = 1; w.push_back(l); for (int k = n-1; k > 1; k--){ sort(w.begin(), w.end()); int reset = 0; int l = 1, r = n; for (int i = 0; i < (int)w.size() - 1; i++){ if (reset){ break; } l = w[i], r = w[i+1] - 1; while(l < r){ int mid = (l+r)/2; int x = query(w[i], mid); if (x == abs(ans[w[i]] - k)){ r = mid; reset = 1; } else { l = mid+1; } } } ans[l] = k; w.push_back(l); } for (int i = 1; i <= n; i++){ answer(i, ans[i]); } }