PKU 数据结构与算法 2025 复习题 坐公交
题目大意
A 城市有 n 个路口,由 n-1 条道路连接,保证所有路口可以通过这些道路相互联通。
A 城市总共有 m 条公交线路,第 i 条公交在路口 x[i] , y[i] 之间双向往复开行。经过并停靠路口 x[i] , y[i] 最短路径上每一个路口。
A 城市现在总共有 q 条出行请求,第 i 条出行请求希望从路口 p[i] 前往路口 q[i] 。作为一家成熟的导航公司,你只需要给出一个乘坐公交的顺序,使得乘客能够与从路口 p[i] 前往路口 q[i] ,且乘坐不同公交的数量尽量的少;或者是说明不存在只乘坐公交从路口 p[i] 前往路口 q[i] 的方案。
n<=200000
题解
简单看看性质:
- 从 p 到 q 只能做公交,那公交肯定是往前做,往后坐之后迟早也要往前。而且如果公交走出了 \(p\leadsto q\) 的路径,就还要坐其它公交坐回来。因此可以把问题局限在 \(p\leadsto q\) 这个链上,所有运营线路 \(x,y\) 也和这个链取交;
- 那么每次肯定是贪心的坐往前最多的,坐到头
那么已经有了大概的思路,就是先求出 \(t=\text{LCA}(p,q)\),然后分别使用倍增走 \(p\to t\) 和 \(q\to t\) 的路线,但是要在下一次就抵达 \(t\) 的这一次停下来——比方说 \(p\to p',q\to q'\) 且 \(p',q'\) 深度都严格大于 \(t\) 的深度,这一步就要分两种情况:
- 存在直接从 \(p'\to q'\) 的线路,那么就多一次乘坐;
- 不存在直达的,就 \(p'\to t,q'\to t\),多两次
现在问题就是,有多个询问 \(p',q'\),看看是否有公交线路 \(x,y\) 完全包含 \(p',q'\),这个我没什么好的想法,粗暴的做法就是判断 \(x,y\) 是否分别在 \(p',q'\) 的子树内,以 dfn 序为坐标映射到二维平面的话,就是矩形查询是否有点,然后扫描线。

浙公网安备 33010602011771号