APIO2016 Gap
与这题思路一样Consecutive Max Difference
Codeforces Round #545 (Div. 1) D. Cooperative Game
先派两个人走,一个人走一步,一个人走两步,当他们相遇后,所有人一起走,当所有人都相遇后就是答案
THUWC2019 Day2T2
先用(n − 1)次(feature1)算出每个点的深度,然后对于每个点求它的父亲是上一层的那个点,每个点求父亲可以用一次(feature2)或(O(log n))次(feature1)操作完成(要注意到询问的集合是可重集)
- 对于第一种情况,要求一个点的父亲,用(feature2)询问所有上层点和上层点个数-1个当前点,可以证明返回的一定是他的父亲。由于第一层只有第一个点,注意第二层可以直接找到父亲,且如果第二层也只有一个点,那么第三层也可以这么算,以此类推,事实上最多只要求(n - 3)个点的父亲
- 对于第二种情况,首先我们先考虑一种特殊的情况:第二层有很多点,现在要求出第三层某个点父亲。只要二分一下,每次取出当前区间的一般,用(feature1)去算出它的父亲在不在这个区间里,这样递归下去。再考虑另一种情况,如果我们选择了询问这点个和上层的某个点,那么根据(feature1)返回的距离我们可以得出它们的(LCA),这样也可以缩小范围。考虑如果我们询问由前面所有层构成的树进行树剖后根到叶子的重链,那么范围所能缩小到那个(LCA)的所有轻儿子,因为重儿子被我们排除掉了。可是到底应该是哪个轻儿子呢?不然我们无法继续这么询问一条重链。那我们就考虑之前提到的,对所有轻儿子二分,那么就做完了,询问次数为(O(log n))