平面分治学习笔记
分治全家桶还在累积!感觉这类分治和其他分治还是稍有区别的,但是基本思想依然是暴力的强制钦定。
P3350 [ZJOI2016] 旅行者
通过题来讲吧。各类分治的区别实际上都没那么大,于是序列分治点分治什么的可以套上的类整体二分的东西也可以套在这题的平面分治上。
根据一般分治的思路,我们可以从中间劈开然后递归到子问题上。具体的,对于平面分治,我们要做的就是每次选择长边并将其切成两半,在计算时让询问的路径强制经过中线(中线长度为短边)。
于是我们发现,我们进行分治的时候,并不是对询问进行分治,而是以路径为第一关键字进行分治。这样类似点分治,我们把路径分为了过中线与不过中线,过中线的计算一次,不过中线的继续递归。特别的,若询问两点在中线两侧,则路径必然过中线,直接扔掉无需递归。
一个询问不一定只会被统计一次,理论上,每个询问都可能被统计分治层数次,只要询问覆盖的矩形够小即可。
那么我们要做的就是每次取中线每个点为起点跑一边 Dijkstra,然后询问的时候把两条路径拼起来即可。
复杂度证明:
在本题中,平面分治的复杂度使用面积法分析较好。我们设 \(nm=k\),则有 \(\min(n,m)\leq \sqrt{k}\),我们的复杂度是由这个保证的。
I. Dijkstra 的复杂度
单层 \(Dij\) 的复杂度是 \(k\sqrt{k}\log(k)\)。我们设 \(T(k)\) 为面积为 \(k\) 时的复杂度。
我们有 \(T(k)=2T(\frac{k}{2})+k\sqrt{k}\log{k}\),可以分析到 \(O(n\sqrt{n}\log^2{n})\),但是题解可以分析到一个 \(\log\) 我不知道咋分析的,还是我分析错了可以和我说一声我改。但是已知的是,即使是两个 \(\log\),那个 \(\log\) 也不是满的,具体可以画分治树分析一下。
II. 询问复杂度
有 \(Q\) 个询问,每个询问会跑至多 \(\log(k)\) 次,于是我们可以分析到 \(O(Q\log{k})\) 这个复杂度。
总体,我们的复杂度是 \(O(n\sqrt{n}\log^2{n}+Q\log{k})\),可以通过。
Update:deepseek 好像说确实是一个 \(\log\) 的,但是我没有看懂。
何时适用:
这个我们一般根据复杂度分析:\(O(n\sqrt{n}\log^2{n})\),说明只要仅与面积或者短边长度相关的操作而不进行和长边平方等相关的违规操作,复杂度分析中都只会多 \(\log\) 或多常数。这样我们就可以使用平面分治。
可拓展性:
只要一个东西可以可以进行完全分成多个部分的操作就可以进行分治。分治复杂度还要视结构保证。

浙公网安备 33010602011771号