首先处理出 fi 表示 i 向上一小时最多走到什么地方。
由于边权只有 1,2,这个可以树上双指针 O(n)。
询问时,显然应当跳 fi 到一个最浅的深于 LCA 的点,然后考虑最后这一段路程是否超过 D。
然而倍增是卡不过的,考虑离线,Tarjan 求 LCA 并把询问记录在 LCA 上。
注意到可以利用 Tarjan 类似的思路,用并查集来维护这个能跳到的最浅点,而利用回溯时的更新保证不会跳到 LCA 或以上。
同时需要记录步数,这个是带权并查集基本操作(
代码:
1 |
|
首先处理出 fi 表示 i 向上一小时最多走到什么地方。
由于边权只有 1,2,这个可以树上双指针 O(n)。
询问时,显然应当跳 fi 到一个最浅的深于 LCA 的点,然后考虑最后这一段路程是否超过 D。
然而倍增是卡不过的,考虑离线,Tarjan 求 LCA 并把询问记录在 LCA 上。
注意到可以利用 Tarjan 类似的思路,用并查集来维护这个能跳到的最浅点,而利用回溯时的更新保证不会跳到 LCA 或以上。
同时需要记录步数,这个是带权并查集基本操作(
代码:
1 | #include <cstdio> |
Related Issues not found
Please contact @Alpha1022 to initialize the comment