题意简述
有n个城市,海拔高度互不相同,两城市间距离定义为海拔差的绝对值,且只能从编号小的城市前往编号大的城市。小A和小B驾驶一辆车游览这些城市,他们从某一个城市S出发,两人轮流开车(小A先开,小B后开):
- 每次换小B时,会前往与当前城市海拔差距最小的城市。
- 每次换小A时,会前往与当前城市海拔差距第二小的城市。
如果不存在下一个喜欢的城市,他们会结束旅行。另外他们不希望驾驶总路程超过x,如果前往下一个城市将会超过x,也会结束旅行。
已知n个城市的海拔高度h[i]。接下来请回答M个询问,每个询问会给定起点S、总路程限制x,求两人分别能行驶的公里数。
数据范围
1 <= n, M <= 105
0 <= x <= 109
-109 <= h[i] <= 109
分析
难点1:快速求解询问
这题的题意比较简单,主要难点是询问个数很多、数据规模特别大。
- 先考虑模拟的方法,复杂度将达到O(nM),一定会超时,肯定不能模拟。
- 再考虑预处理询问(合并处理相似询问),这需要看询问间有无共性或关联。但这些询问可能会以每一个城市作为起点,比如第一个询问给定(S=1, x=50),第二个询问给定(S=12, x=100),可能第一个询问场景下AB旅行都结束了,还没到走第二个询问场景的起点12。可见,询问之间的关联比较难找到,这条路也不可行。
因此需要找到能够快速解答每个询问的算法,一般来说需要O(logN)级别的算法。
这时很容易联想到RMQ问题,采用动态规划空间换时间的策略,预先计算好每个起点S、每个x的结果,然后各个询问都可以秒解答。
空间换时间的思路虽然不错,然而数据中的x达到了10<