1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <bits/stdc++.h> #include "park.h" #define rep(i, a, b) for(int i = (a); i <= (b); i++) #define per(i, a, b) for(int i = (a); i >= (b); i--) #define pb push_back using namespace std; const int MXN = 4010; int n;
void Answer(int A, int B); int Ask(int A, int B, int Place[]);
namespace Sub3 { int g[MXN], vis[MXN], used[MXN]; vector<int> hv, e[MXN]; int check(int S, vector<int> G) { rep(i, 0, n - 1) g[i] = 0; for(auto v : G) g[v] = 1; g[S] = 1; return Ask(min(G[0], S), max(G[0], S), g); } int Find(int x) { int l = 1, r = n - 2, res = n - 1, mid; for(; l <= r;) { mid = (l + r) >> 1; rep(i, 0, mid) g[i] = (vis[i] != 2); rep(i, mid + 1, n - 1) g[i] = (vis[i] == 1); g[x] = 1; if(Ask(0, x, g)) res = mid, r = mid - 1; else l = mid + 1; } return res; } void dfs(int u, vector<int> &G) { G.pb(u), used[u] = 0; for(auto v : e[u]) if(used[v]) dfs(v, G); } void Finde(int x, vector<int> G) { if(!check(x, G)) { for(auto v : G) used[v] = 0; return ; } int l = 0, r = G.size() - 2, res = G.size() - 1, mid; for(; l <= r;) { mid = (l + r) >> 1; rep(i, 0, n - 1) g[i] = 0; rep(i, 0, mid) g[G[i]] = 1; g[x] = 1; if(Ask(min(G[0], x), max(G[0], x), g)) res = mid, r = mid - 1; else l = mid + 1; } int u = G[res]; for(auto i : G) used[i] = 1; used[u] = 0; for(auto v : e[u]) if(used[v]) { vector<int> tmp; dfs(v, tmp), Finde(x, tmp); } Answer(min(u, x), max(u, x)), e[u].pb(x), e[x].pb(u); } void solve(int x) { vis[x] = 2; for(; !check(x, hv); solve(Find(x))); for(auto v : hv) used[v] = 1; vector<int> tmp; dfs(0, tmp), Finde(x, tmp), vis[x] = 1, hv.pb(x); } void MAIN() { hv.pb(0), vis[0] = 1; rep(i, 1, n - 1) if(!vis[i]) solve(i); } } void Detect(int T, int NN) { n = NN; Sub3::MAIN(); return ; }
|