题解:P10440 [JOISC 2024] 环岛旅行
来补篇题解 111
首先一种想法就是把
const int N = 3e2 + 5;
int p[N], a[N], vis[N];
void solve(int n, int s) {
ROF(i, n - 1, 1) {
int u = query(1, i);
FOR(j, 1, n) {
int v = query(u, j);
if(p[v] == u) continue;
p[u] = v;
break;
}
}
FOR(i, 2, n) answer(p[i], i);
}
但是每次会查询一个点的所有邻居,而有用的信息只有其父亲,考虑充分利用信息。
还是将
这样的话,每次
这样就做到了
const int N = 3e2 + 5;
int p[N], a[N], vis[N];
void solve(int n, int s) {
vis[1] = 1;
FOR(i, 1, n - 1) {
int u = query(1, i);
vis[u] = 1;
int c = 0;
while(! p[u]) {
int v = query(u, ++ c);
if(vis[v]) p[u] = v;
else p[v] = u;
}
}
FOR(i, 2, n) answer(p[i], i);
}