「杂题乱刷2」at_abc365_f
题目链接
解题思路
根号分治。
首先有一个显然的贪心,就是能往右走,是一定要往右走的,而剩下的情况,若我们在最高点的上面,那么一直往下走直到可以往右走是最优的,若我们在最低点的下面,那么一直往上走直到可以往右走是最优的。
于是我们就有了 \(O(nq)\) 的做法。
设阙值为 \(B\),需要行走的横距离小于等于 \(B\) 的询问直接暴力做即可。
对于剩余的情况,我们可以直接预处理 \(f1_{i,0/1}\) 表示第 \(i\) 格的最上/下方到达 \(i + \sqrt{n}\) 格时所需的最少的步数,\(f1_{i,0/1}\) 表示第 \(i\) 格的最上/下方到达 \(i + \sqrt{n}\) 格时所需的最少的步数最终到达的点。
于是对于一开始,我们可以直接使用线段树 + 二分的方式来找到第一个不能直接往右走的点,之后走 \(\sqrt{n}\) 格后再次进行二分,这样循环往复地进行操作即可。
时间复杂度 \(O(n \sqrt{n} \log n)\)。