优化建图

zhone-lb / 2025-02-21 / 原文

分层图

例1 [P4568] 飞行路线

分层图模板题

给定一张图,你有k次机会将一条边修改权值为0,问最短路

k较小时,可以用分层图解决

例2 [P1266] 速度限制

注意到n,v比较小,考虑分成v层图,但是时间空间会炸

发现每一层对于边u->v的转移相同,考虑只分节点,共用边,即开dis数组开第二维度存v,将dis[x][v],x,v打包放入堆中维护

得出结论:

分层图中如果每层的边转移相同,可以只存点,用二维dis数组维护

曼哈顿距离 & 切比雪夫距离

对于两点:\((x_1,y_1),(x_2,y_2)\)

曼哈顿距离:\(d=|x_1-x_2|+|y_1-y_2|\)

切比雪夫距离:\(d=max(|x_1-x_2|,|y_1-y_2|)\)

转化

一个点 \((x,y)\) 的坐标变为 \((x+y,x-y)\) 后,原坐标系中曼哈顿距离 = 新坐标系中切比雪夫距离。

一个点 \((x,y)\) 的坐标变为 \((\frac{x+y}{2},\frac{x-y}{2})\) 后,原坐标系中的切比雪夫距离 = 新坐标系中的曼哈顿距离。

证明略

记忆技巧:曼哈顿比切比雪夫名字短,所以转化要除以2,正数更受欢迎,所以先加再减

适用情景

有曼哈顿距离或切比雪夫距离(废话

对这个距离做性质相异的操作(如对曼哈顿取max)

P7561 [JOISC 2021 Day2] 道路の建設案 (Road Construction)

先转换模型:曼哈顿\(\to\)切比雪夫

二分第\(k\)便宜的点对,问题变成二维数点,扫描线+树状数组解决

接下来就是统计答案了,搞了个很弱的做法(类似平面最近点对),差点跑满10s(如何优化)

P6751 [IOI2019] 视觉程序

(题解大佬用二进制加法器实现了,%%%

看到题目中曼哈顿距离,考虑转成切比雪夫,即求新图中\(max(x_1-x_2,y_1-y_2)\)恰好等于\(k\)

两维分开考虑,容斥分为\(\le k\)\(\le k-1\),对于单个贡献,向后或上\(k\)位就懂得有没有了

注意会出现,对于一个维度,两个点重合于一个位置的情况

数据结构优化建图

线段树

主席树

树套树

P5471 [NOI2019] 弹跳

直接树套树建边,空间复杂度是\(O(n\log^2n)\)的,过不了

考虑在\(dijkstra\)时,每次从堆中取出时间最小的一个矩形,此时该矩形内的点一定只能被该矩形松弛,更新这些点,并从树套树上删掉,然后把出边丢进堆里继续做即可

与常规\(dijkstra\)不同的是,这里堆里不存点,存边(矩形),因为存点的话,还得枚举出边,反复更新一些点的值,这显然不够好,而一个矩形内的点的状态都是一样的,缩起来更新即可

至于为什么平常dijkstra不用存边的方法,呃,其实和存点效果一样,这里是多个点连同样的边才有这种优秀性质的

K-D Tree