今早在写这题的时候,我的 DFS 函数是这样实现的:
void dfs(int x,int fa) {
f[0][x] = fa;
dep[x] = dep[fa] + 1;
dfn[x] = ++cnt;rk[cnt] = x;
root[dfn[x]] = insert(root[dfn[fa]],1,m,a[x]);
for (auto y : G[x]) {
if (y != fa) {
dfs(y,x);
}
}
for (int i = 1;i <= 20;++i) {
f[i][x] = f[i-1][f[i-1][x]];
}
}
在此处我将 dfn 作为 root 的下标进行建树,只有测试点 #3 通过了,下午我尝试这样实现:
void dfs(int x,int fa) {
f[0][x] = fa;
dep[x] = dep[fa] + 1;
dfn[x] = ++cnt;rk[cnt] = x;
root[x] = insert(root[fa],1,m,a[x]);
for (int i = 1;i <= 20;++i) {
f[i][x] = f[i-1][f[i-1][x]];
}
for (auto y : G[x]) {
if (y != fa) {
dfs(y,x);
}
}
}
也就是将点直接作为 root 的下标,这样却通过了本题。不太能理解为什么会发生这样的情况,理论上来说这两种方式不应该等价吗?