Submission #1164682

#TimeUsernameProblemLanguageResultExecution timeMemory
1164682ReLiceXylophone (JOI18_xylophone)C++20
100 / 100
19 ms832 KiB
#include "xylophone.h" #include <bits/stdc++.h> #define ll int #define ld double #define pb push_back #define pf push_front #define ins insert #define fr first #define sc second #define endl "\n" #define ar array #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() using namespace std; void solve(ll n) { ll i; ll l = 1, r = n; ll ans[n + 3]; while(l + 1 < r){ ll m = (l + r) / 2; ll a = query(1, m); if(a == n - 1) r = m; else l = m; } map<ll,ll> mp; ans[r] = n; mp[n] ++; if(r < n) ans[r + 1] = n - query(r, r + 1); ans[r - 1] = n - query(r - 1, r); auto check = [&](ll a, ll b, ll c, ll ab, ll ac, ll bc){ if(abs(a - b) != ab || abs(b - c) != bc) return false; return max({a, b, c}) - min({a, b, c}) == ac; }; for(i=r-2;i>0;i--){ mp[ans[i + 1]]++; ll d = query(i, i + 1); ll a = ans[i + 1] - d; ll b = ans[i + 1] + d; if(mp[a] || a < 1){ ans[i] = b; continue; } if(mp[b] || b > n){ ans[i] = a; continue; } ll d2 = query(i, i + 2); if(check(a, ans[i + 1], ans[i + 2], d, d2, abs(ans[i + 1] - ans[i + 2]))) ans[i] = a; else ans[i] = b; } for(i=r+2;i<=n;i++){ mp[ans[i - 1]]++; ll d = query(i - 1, i); ll a = ans[i - 1] - d; ll b = ans[i - 1] + d; if(mp[a] || a < 1){ ans[i] = b; continue; } if(mp[b] || b > n){ ans[i] = a; continue; } ll d2 = query(i - 2, i); if(check(ans[i - 2], ans[i - 1], a, abs(ans[i - 1] - ans[i - 2]), d2, d)) ans[i] = a; else ans[i] = b; }; for(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...