제출 #1156129

#제출 시각아이디문제언어결과실행 시간메모리
1156129tvgkXylophone (JOI18_xylophone)C++20
100 / 100
17 ms448 KiB
#include "xylophone.h" #include<bits/stdc++.h> using namespace std; #define task "a" #define se second #define fi first #define ll long long #define ii pair<ll, ll> const long mxN = 5e3 + 7; bool dd[mxN]; int a[mxN], dif[mxN]; int Check(int j, int n) { if (j <= 0 || j > n || dd[j]) return 0; return j; } void solve(int n) { int l = 1, r = n, vt = 0; while (l <= r) { int mid = (l + r) / 2; int tmp = query(1, mid); if (tmp == n - 1) { vt = mid; r = mid - 1; } else l = mid + 1; } dd[n] = 1; a[vt] = n; for (int i = vt + 1; i <= n; i++) { dif[i] = query(i - 1, i); if (Check(a[i - 1] - dif[i], n) && Check(a[i - 1] + dif[i], n)) { int tmp = query(i - 2, i); if (tmp == dif[i] + dif[i - 1]) a[i] = a[i - 2] - (a[i - 2] - a[i - 1]) / dif[i - 1] * tmp; else a[i] = a[i - 1] + (a[i - 2] - a[i - 1]) / dif[i - 1] * dif[i]; } else a[i] = max(Check(a[i - 1] - dif[i], n), Check(a[i - 1] + dif[i], n)); dd[a[i]] = 1; } for (int i = vt - 1; i >= 1; i--) { dif[i] = query(i, i + 1); if (Check(a[i + 1] - dif[i], n) && Check(a[i + 1] + dif[i], n)) { int tmp = query(i, i + 2); if (tmp == dif[i] + dif[i + 1]) a[i] = a[i + 2] - (a[i + 2] - a[i + 1]) / dif[i + 1] * tmp; else a[i] = a[i + 1] + (a[i + 2] - a[i + 1]) / dif[i + 1] * dif[i]; } else a[i] = max(Check(a[i + 1] - dif[i], n), Check(a[i + 1] + dif[i], n)); dd[a[i]] = 1; } // cout << vt << '\n'; // for (int i = 1; i <= n; i++) // cout << a[i] << " " << dif[i] << " "; // cout << '\n'; 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...