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 序为坐标映射到二维平面的话,就是矩形查询是否有点,然后扫描线。

posted @ 2025-12-09 19:55  哼唧昂叽  阅读(17)  评论(0)    收藏  举报