NOI2019 弹跳【区间连边最短路问题】

题目描述:

LOJ3159

n n n个点,每个点有一个二维坐标,有 m m m条边,每条边从一个点出发,可以走到坐标范围在一个矩形区域内的点,代价为 t i t_i ti。求从1号点到其他点的最短路。

n ≤ 7 ∗ 1 0 4 , m ≤ 1.5 ∗ 1 0 5 n\le7*10^4,m\le1.5*10^5 n7104,m1.5105

题目分析:

提供两种做法。

法一:优化建边

如果问题是一维,容易想到线段树优化建边,二维就是二维线段树,然而空间是 n log ⁡ 2 n n\log^2n nlog2n的。所以使用KD树。
对一个矩形连边就是KD树上找矩形。KD树上的点向两个儿子连边权为0的边。
然而直接将边建出来仍然无法承受,因为点找矩形的边可能达到 O ( n n ) O(n\sqrt n) O(nn )级别。可以不将边实际建出来,而只是利用KD树进行转移,当优先队列的堆顶是实点时进KD树修改对应矩形的距离,当堆顶是KD树上的点时就加入两个儿子。
这样做的理论复杂度虽然是 O ( n n log ⁡ n ) O(n\sqrt n\log n) O(nn logn),但是因为进KD树修改矩形时有较多的剪枝,因此实际运行效果优异,LOJ上目前最快的解法就是这个,比如 https://loj.ac/submission/825571

法二:区间删点

注意到Dijkstra边权非负的贪心性质,如果当前优先队列的堆顶是表示的是一个矩形,它离1号点的距离为 d d d,那么它到矩形内的边权都是0,那么矩形内还没有被其它矩形更新的点的距离都会被确定为 d d d,于是就可以把它们从待更新的区域删掉。

用数据结构实现上述过程,就是每次找出一个矩形内的点,将它们的距离全部更新为 d d d,然后删除这些点(或者打上标记不会再被更新)。删除的点在此题中不用放进优先队列,可以直接把它们对应的矩形加上边权后放入优先队列。

找矩形以及删除可以用线段树套 s e t set set轻易完成(线段树表示第一维,set表示第二维,用set是因为它的空间复杂度是 O ( n ) O(n) O(n)的),代码复杂度极小。当然也可以使用KD树打标记。
前者的时间复杂度是 O ( n log ⁡ 2 n + m log ⁡ m ) O(n\log^2n+m\log m) O(nlog2n+mlogm),Code:https://loj.ac/submission/826100
后者的复杂度是 O ( m n + m log ⁡ m ) O(m\sqrt n+m\log m) O(mn +mlogm)。但是感觉KD树会跑得更快(大常数 s e t set set)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值