[NOIP2012]开车旅行 超详细思考过程

本文详细分析了NOIP2012中关于开车旅行的算法问题,探讨了如何快速求解询问及寻找最近的2个城市。通过动态规划和二进制技巧优化了算法复杂度,提出使用双向链表来高效处理数据,总时间复杂度达到O((N+M)×Log2(N))。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意简述

有n个城市,海拔高度互不相同,两城市间距离定义为海拔差的绝对值,且只能从编号小的城市前往编号大的城市。小A和小B驾驶一辆车游览这些城市,他们从某一个城市S出发,两人轮流开车(小A先开,小B后开):

  1. 每次换小B时,会前往与当前城市海拔差距最小的城市。
  2. 每次换小A时,会前往与当前城市海拔差距第二小的城市。

如果不存在下一个喜欢的城市,他们会结束旅行。另外他们不希望驾驶总路程超过x,如果前往下一个城市将会超过x,也会结束旅行。

已知n个城市的海拔高度h[i]。接下来请回答M个询问,每个询问会给定起点S、总路程限制x,求两人分别能行驶的公里数。

数据范围

1 <= n, M <= 105

0 <= x <= 109

-109 <= h[i] <= 109

分析

难点1:快速求解询问

这题的题意比较简单,主要难点是询问个数很多、数据规模特别大。

  1. 先考虑模拟的方法,复杂度将达到O(nM),一定会超时,肯定不能模拟。
  2. 再考虑预处理询问(合并处理相似询问),这需要看询问间有无共性或关联。但这些询问可能会以每一个城市作为起点,比如第一个询问给定(S=1, x=50),第二个询问给定(S=12, x=100),可能第一个询问场景下AB旅行都结束了,还没到走第二个询问场景的起点12。可见,询问之间的关联比较难找到,这条路也不可行。

因此需要找到能够快速解答每个询问的算法,一般来说需要O(logN)级别的算法。

这时很容易联想到RMQ问题,采用动态规划空间换时间的策略,预先计算好每个起点S、每个x的结果,然后各个询问都可以秒解答。

空间换时间的思路虽然不错,然而数据中的x达到了10<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值