Submission #1147914

#TimeUsernameProblemLanguageResultExecution timeMemory
1147914minh30082008Xylophone (JOI18_xylophone)C++20
0 / 100
0 ms420 KiB
#include <cstdio> #include <cstdlib> #include "xylophone.h" #include<bits/stdc++.h> #define INF 1e18 #define fi first #define se second #define FOR(i, k, n) for(ll i = k; i <= n; i++) #define FOR1(i, k, n) for(ll i = k; i >= n; i--) #define pb push_back #define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define vi vector<int> #define pii pair<int, int> #define vii vector<pii> #define ll long long #define vll vector<ll> #define pll pair<ll, ll> #define re return 0 #define mii map<int, int> #define input "chinaflu.inp" #define output "chinaflu.out" #define rf freopen(input, "r", stdin); freopen(output, "w", stdout) using namespace std; const int maxn = 3e5 + 5; const int mod = 1e9 + 9; const int base = 998244353; void add(int &a, int b) { a += b; if(a >= mod) a -= mod; if(a < 0) a += mod; } mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return uniform_int_distribution<int>(l, r) (rd); } bool vis[5005]; int ans[5005]; void solve(int n) { FOR(i, 1, n) vis[i] = ans[i] = 0; int l = 1, r = n; int vt = -1; while(l <= r) { int mid = (l + r) >> 1; int k = query(1, mid); if(k == n - 1) { vt = mid; r = mid - 1; } else l = mid + 1; } ans[vt] = n; vis[n] = 1; l = 1, r = vt - 1; int vt1; while(l <= r) { int mid = (l + r) >> 1; int k = query(mid, vt); if(k == n - 1) { vt1 = mid; l = mid + 1; } else r = mid - 1; } ans[vt1] = 1; vis[1] = 1; int id = vt1 - 1; while(id) { int k = query(id, id + 1); if(ans[id + 1] - k <= 0) { ans[id] = ans[id + 1] + k; vis[ans[id]] = 1; id--; continue; } if(ans[id + 1] + k > n) { ans[id] = ans[id + 1] - k; vis[ans[id]] = 1; id--; continue; } if(vis[ans[id + 1] + k]) { ans[id] = ans[id + 1] - k; vis[ans[id]] = 1; id--; continue; } if(vis[ans[id + 1] - k]) { ans[id] = ans[id + 1] + k; vis[ans[id]] = 1; id--; continue; } int z = query(id, id + 2); if(ans[id + 2] > ans[id + 1]) { if(z == ans[id + 2] - ans[id + 1] || z == k) { ans[id] = ans[id + 1] + k; vis[ans[id]] = 1; id--; continue; } else { ans[id] = ans[id + 1] - k; vis[ans[id]] = 1; id--; continue; } } else { if(z == ans[id + 1] - ans[id + 2] || z == k) { ans[id] = ans[id + 1] - k; vis[ans[id]] = 1; id--; continue; } else { ans[id] = ans[id + 1] + k; vis[ans[id]] = 1; id--; continue; } } } id = vt1 + 1; while(id < vt) { int k = query(id - 1, id); if(ans[id - 1] + k > n) { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } if(ans[id - 1] - k < 1) { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } if(vis[ans[id - 1] - k]) { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } if(vis[ans[id - 1] + k]) { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } int z = query(id - 2, id); if(ans[id - 1] > ans[id - 2]) { if(z == ans[id - 1] - ans[id - 2] || z == k) { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } else { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } } else { if(z == ans[id - 1] - ans[id - 2] || z == k) { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } else { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } } } id = vt + 1; while(id <= n) { int k = query(id - 1, id); if(ans[id - 1] + k > n) { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } if(ans[id - 1] - k < 1) { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } if(vis[ans[id - 1] - k]) { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } if(vis[ans[id - 1] + k]) { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } int z = query(id - 2, id); if(ans[id - 1] > ans[id - 2]) { if(z == ans[id - 1] - ans[id - 2] || z == k) { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } else { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } } else { if(z == ans[id - 1] - ans[id - 2] || z == k) { ans[id] = ans[id - 1] + k; vis[ans[id]] = 1; id++; continue; } else { ans[id] = ans[id - 1] - k; vis[ans[id]] = 1; id++; continue; } } } FOR(i, 1, n) answer(i, ans[i]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...