如何求出各种二维偏序

如何求出各种二维偏序?

本章收录怎样的题?

1

收录类似于上图,区间修改、查询二维空间一定正斜交范围内点信息的问题。

目录

链接 离线否 描述 图示
二维树状数组 几乎所有问题 2
树状数组 - 3
扫描线 每次删除方框内的数,最后查询有多少被删除 3
线段树+双端队列 每次删除上下双方框内的数,并查询哪些数删除 4
二向树状数组 每次修改所有值,在线维护哪些点符合连续要求。 5

1. 二维树状数组

点数量n 坐标值域A 查数量Q 修数量R 时间复杂度 空间复杂度
n A m m (n+m)logA2 A2

略。

2. 离线树状数组

点数量n 坐标值域A 查数量Q 修数量R 时间复杂度 空间复杂度
n A m m (m+n)logA n

略。

3. 扫描线

点数量n 坐标值域A 查数量Q 修数量R 时间复杂度 空间复杂度
n A 1 m (m+n)logn AlogA

开线段树存储一列里面的点。

4. 线段树+双端队列

点数量n 坐标值域A 查数量Q 修数量R 时间复杂度 空间复杂度
n A m m (m+n)logn AlogA+n

例题: 有害边树

开线段树维护每个 x 坐标所对应的一竖列上半部分方框的最下端 p1 和下半部分方框最上端 p2 ,把 deque 里面不符合条件的弹出。由于每次询问要查询所对应的区间,所有点一共只会被弹出 n 次,复杂度 (m+n)logn

双端队列可以被换成 set

5. 二向树状数组

(或线段树)

点数量n 坐标值域A 查数量Q 修数量R 时间复杂度 空间复杂度
n A m m (A+m)logA 3A

例题:传感器

由于维护的是【查询点的值是否在一段连续范围内】,我们只需要知道多久进入这段范围,多久出这段范围就行了。一个点可以由双向树状数组的 2log(A)+1 个节点 (或线段树的 2log(A) 个节点) 覆盖。因此当每个树状数组上的节点更改到【可能使该查询点更新的】值,就暴力更新查询点。

每个查询点对应 2log(A)+1 个树状数组节点,每个树状数组节点进一次、出一次连续范围,因此总复杂度 4nlogA

posted @   DZhearMins  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示