如何求出各种二维偏序
如何求出各种二维偏序?
本章收录怎样的题?
收录类似于上图,区间修改、查询二维空间一定正斜交范围内点信息的问题。
目录
链接 | 离线否 | 描述 | 图示 |
---|---|---|---|
二维树状数组 | 在 | 几乎所有问题 | |
树状数组 | 离 | - | |
扫描线 | 离 | 每次删除方框内的数,最后查询有多少被删除 | |
线段树+双端队列 | 在 | 每次删除上下双方框内的数,并查询哪些数删除 | |
二向树状数组 | 在 | 每次修改所有值,在线维护哪些点符合连续要求。 |
1. 二维树状数组
点数量n | 坐标值域A | 查数量Q | 修数量R | 时间复杂度 | 空间复杂度 |
---|---|---|---|---|---|
\(n\) | \(A\) | \(m\) | \(m\) | \((n+m)\log A^2\) | \(A^2\) |
略。
2. 离线树状数组
点数量n | 坐标值域A | 查数量Q | 修数量R | 时间复杂度 | 空间复杂度 |
---|---|---|---|---|---|
\(n\) | \(A\) | \(m\) | \(m\) | \((m+n)\log A\) | \(n\) |
略。
3. 扫描线
点数量n | 坐标值域A | 查数量Q | 修数量R | 时间复杂度 | 空间复杂度 |
---|---|---|---|---|---|
\(n\) | \(A\) | \(1\) | \(m\) | \((m+n)\log n\) | \(A\log A\) |
开线段树存储一列里面的点。
4. 线段树+双端队列
点数量n | 坐标值域A | 查数量Q | 修数量R | 时间复杂度 | 空间复杂度 |
---|---|---|---|---|---|
\(n\) | \(A\) | \(m\) | \(m\) | \((m+n)\log n\) | \(A\log A+n\) |
例题: 有害边树
开线段树维护每个 \(x\) 坐标所对应的一竖列上半部分方框的最下端 \(p1\) 和下半部分方框最上端 \(p2\) ,把 deque
里面不符合条件的弹出。由于每次询问要查询所对应的区间,所有点一共只会被弹出 \(n\) 次,复杂度 \((m+n)\log n\)。
双端队列可以被换成 set
5. 二向树状数组
(或线段树)
点数量n | 坐标值域A | 查数量Q | 修数量R | 时间复杂度 | 空间复杂度 |
---|---|---|---|---|---|
\(n\) | \(A\) | \(m\) | \(m\) | \((A+m)\log A\) | \(3A\) |
例题:传感器
由于维护的是【查询点的值是否在一段连续范围内】,我们只需要知道多久进入这段范围,多久出这段范围就行了。一个点可以由双向树状数组的 \(2\log(A)+1\) 个节点 (或线段树的 \(2\log(A)\) 个节点) 覆盖。因此当每个树状数组上的节点更改到【可能使该查询点更新的】值,就暴力更新查询点。
每个查询点对应 \(2\log(A)+1\) 个树状数组节点,每个树状数组节点进一次、出一次连续范围,因此总复杂度 \(4n\log A\)