Skip to content

Commit e2bc956

Browse files
authored
Update Readme.md
1 parent f039b3c commit e2bc956

File tree

1 file changed

+6
-2
lines changed
  • Binary_Search/1483.Kth-Ancestor-of-a-Tree-Node

1 file changed

+6
-2
lines changed

Binary_Search/1483.Kth-Ancestor-of-a-Tree-Node/Readme.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ node = parent[node][0], node = p[node][1], node = p[node][1], node = p[node][1]
99
```
1010
node = p[node][0], node = p[node][1], node = p[node][2]
1111
```
12-
由此可知,如果我们预先知道每个node的2^i代祖先parent[node][i],那么我们就能减少query的次数。这样能减少多少呢?对于node的k代祖先,只需要将k做二进制分解,有多少个为1的bit,就做多少次query。考虑到k<=5*10^4,最多只需要20次query,就能够实现查询任意k代祖先。
12+
由此可知,如果我们预先知道每个node的2^i代祖先parent[node][i],那么我们就能减少query的次数。这样能减少多少呢?对于node的k代祖先,只需要将k做二进制分解,有多少个为1的bit,就做多少次query。考虑到k<=5\*10^4,最多只需要20次query,就能够实现查询任意k代祖先。
1313
```cpp
1414
for (int i=0; i<20; i++)
1515
{
@@ -21,4 +21,8 @@ node = p[node][0], node = p[node][1], node = p[node][2]
2121
}
2222
return node;
2323
```
24-
接下来我们考虑如何构建p[node][j].我们知道node的4代祖先p[node][2],可以通过两次2代祖先的query来实现,即```node=p[node][1], node=p[node][1]```。于是我们可以发现,如果知道了p[node][j],就可以推出p[node][j+1]。即```p[node][j] = p[p[node][j-1]][j-1]```。所以我们设置两层循环,外循环从小到大确定j,内循环设置node,就可以设置所有的p[node][j]了。
24+
接下来我们考虑如何构建p[node][j].
25+
26+
我们知道node的4代祖先p[node][2],可以通过两次2代祖先的query来实现,即```node=p[node][1], node=p[node][1]```。于是我们可以发现,如果知道了p[node][j],就可以推出p[node][j+1]。即```p[node][j] = p[p[node][j-1]][j-1]```。所以我们设置两层循环,外循环从小到大确定j,内循环设置node,就可以设置所有的p[node][j]了。
27+
28+
这种思想叫做binary lifting.

0 commit comments

Comments
 (0)