偏序问题专题
偏序问题专题
前言
在 OI 中,我们常常能见到要求 \(i\le j\) 这样的条件,它们用来限制问题求解范围。
在只有少量限制时,这些问题的求解较为简单,但是当维度变高,条件变得复杂。
概述
偏序问题最简单的形式有:
给定 \(n\) 个 \(m\) 维坐标点 \((x_{i,1},x_{i,2},\ldots,x_{i,m})\),以及 \(Q\) 个 \(m\) 维坐标点 \((y_{j,1},y_{j,2},\ldots,y_{j,m})\) 作为询问,要求对于每个询问求出满足 \(\forall 1\le k\le m,x_{i,k}\le y_{j,k}\) 的给定 \(m\) 维坐标点个数。
其中 \(\le\) 满足偏序关系,因此得名“偏序问题”。
拓展
在此基础上,该问题还可以延伸。
-
条件:
只有 \(\le\) 实在太单一,还可以使用 \(<,>\) 等拟序关系。
或者用更复杂的关系,比如在树上的位置关系,在图上的位置关系,在数据结构上的位置关系等。
-
内容:
我们可能不是统计满足条件的点的个数,还有可能是位置、最值等。
方法
当我们看到偏序问题,就可以想到枚举每一维来解决这个问题,这样的复杂度可以达到 \(O(n^d)\),非常劣,我们有没有一些方法可以优化?
-
一维偏序问题,我们可以通过排序后遍历等算法来 \(O(n\log{n})/O(n)\) 解决,如果有特殊性质,例如范围较小,可以考虑前缀和、离线来 \(O(n)\) 解决。
-
二维偏序问题,对于其中一维用上面的方法解决,即排序或者离线,可以在 \(O(n\log{n})/O(n)\) 复杂度解决。
此时第二维可以使用数据结构解决,常见的复杂度有 \(O(\log^c(n))/O(n^c)/O(\frac{n}w)\) 等;或者我们可以分治来解决,这种分治就是大家熟知的 CDQ 分治。
一般复杂度在 \(O(n\log{n})\)。
-
三维偏序问题,我们考虑将其中的两维用 CDQ 分治解决,另一维数据结构维护;或者一维排序,两维数据结构来维护;甚至可以直接上 CDQ 套 CDQ。
一般复杂度在 \(O(n\log^2{n})\)。
-
四维偏序问题,也是同理,CDQ 套 CDQ 即可解决,不过还有一些复杂度更优的做法。
一般复杂度在 \(O(n\log^3{n})\),\(O(n\sqrt{n})\)。
-
高维偏序问题,当维数大于 \(4\),上述算法的常数都会变得巨大,那么此时使用
bitset其实是最优的选择。一般复杂度在 \(O(\frac{n^2d}w)\)(\(d\) 是维数)。
-
超高维偏序问题(一般出现在二进制枚举、状态压缩中):例如高维前缀和,这类问题的范围通常不会很大,那么就会有一些特殊的算法,比如 SOS 算法。
技巧
偏序问题中有一些比较常见的技巧,可以简化问题或者让复杂度更优。
- 离散化:这是非常基础的手段。
- 差分容斥:考虑把区间问题变成一般的前后缀偏序问题,当然不行的时候我们可以考虑线段树分治一类区间贡献算法。
- 去重、合并:避免分类讨论或特殊情况带来的问题,我们可以把具有相同特征的值合并到一起。
- 离线处理:对于不强制在线的题目可以考虑离线下来做 CDQ 分治一类算法,否则只能考虑树套树之类的在线算法。
- 降维:一些高维的问题在性质加持下,可以降维,例如三维偏序问题只需求一个满足条件的点时,其实可以降到两维。
应用
偏序问题有许多应用,包括普通数据结构题目,DP 优化,与其他数据结构结合,优化卷积等。
二维偏序
实现方法
- 扫描线:通常二维偏序的解法是一维排序,另一维数据结构维护,这个算法被形象地称为“扫描线”。
- 分治:分治其实也是一种解决二维偏序的常用方法,它通常需要结合双指针来解决。由于数据提前排好了序,分治左区间的第一维与分治右区间的第一维肯定满足偏序关系,那么我们只需要求解第二维即可。
例题
- P1908 逆序对 - 洛谷 (luogu.com.cn):求逆序对数量,使用树状数组,或者归并排序。
- Atlantis - HDU 1542 - Virtual Judge (vjudge.net):扫描线统计面积,使用线段树。
- 覆盖的面积 - HDU 1255 - Virtual Judge (vjudge.net):扫描线统计覆盖到两次的面积,使用线段树。
- Picture - POJ 1177 - Virtual Judge (vjudge.net):扫描线统计周长,使用线段树。
- P6406 [COCI 2014/2015 #2] Norma - 洛谷 (luogu.com.cn):可以使用线段树来求解,两维分别是 \((i,a_i)\)
- P7883 平面最近点对(加强加强版) - 洛谷 (luogu.com.cn):可以考虑分治解决。
- P3776 [APIO2017] 斑斓之地 - 洛谷 (luogu.com.cn):二维数点好题。
- P11390 [COCI 2024/2025 #1] 教师 / Učiteljica - 洛谷 (luogu.com.cn):二维偏序结合状压。
- P6344 [CCO 2017] Vera 与现代艺术 - 洛谷 (luogu.com.cn):二维数点,两维都是 Trie 上关系。
- P14363 [CSP-S 2025] 谐音替换 / replace - 洛谷 (luogu.com.cn):与上一题大体相同。
- P11664 [JOI 2025 Final] 缆车 / Mi Teleférico - 洛谷 (luogu.com.cn):扫描线结合 DAG 结论。
- P9289 [ROI 2018] Quantum teleportation - 洛谷 (luogu.com.cn):扫描线搭配一些奇怪的东西。
- P11364 [NOIP2024] 树上查询 - 洛谷 (luogu.com.cn):这题是一个典型的三维偏序可以优化到二维的例子,用一些性质,例如不会重复的性质,来使三维降到两维。
- P10105 [GDKOI2023 提高组] 游戏 - 洛谷 (luogu.com.cn):这同样也是一道三维偏序降成两维的例题。如果使用三维偏序,那么我们会统计到所有满足要求的点,但是这题的目的只是求一个满足条件的点,所以我们把目的改变一下,变为:前两维满足时,最大的第三维,这个就可以贪心地维护,那么就降到了两维。
- AT_joi2013ho5 バブルソート (Bubble Sort) - 洛谷 (luogu.com.cn):仍然是可以三维偏序降成两维。
- P8253 [NOI Online 2022 提高组] 如何正确地排序 - 洛谷 (luogu.com.cn):也是三维偏序降成两维。
- CF762E Radio stations - 洛谷 (luogu.com.cn):可以用二维偏序 \(O(nk\log{n})\),也可以三维偏序 \(O(n\log_2^2{n})\)。
- CF1045G AI robots - 洛谷 (luogu.com.cn):可以用二维偏序 \(O(nk\log{n})\),也可以三维偏序 \(O(n\log_2^2{n})\)。
三维偏序
实现方法
- CDQ 分治(包括 CDQ 分治套 CDQ 分治):最最常见的三维偏序做法,常数较小,也不复杂,可以与归并结合,还有一些可以使用的技巧。
- 树套树:一般的在线三维偏序方法,通常使用树状数组套值域线段树为多。
- K-D Tree、分块、莫队:根号做法。
- 分组
bitset:适合高维偏序,常数小,大概只有 \(O(\frac{n^2d}w)\)(\(d\) 是维数)。 - 二进制分组套 Wavelet Matrix:单 \(\log\) 做法……
例题
- P3810 【模板】三维偏序(陌上花开) - 洛谷 (luogu.com.cn):模板题,上面的每一种方法在题解区都能找到。
- P7470 [NOI Online 2021 提高组] 岛屿探险 - 洛谷 (luogu.com.cn):三维偏序,两维是坐标值,另一维是 Trie 上的位置。
- P5445 [APIO2019] 路灯 - 洛谷 (luogu.com.cn):三维偏序。
- P3157 [CQOI2011] 动态逆序对 - 洛谷 (luogu.com.cn):非常经典的三维偏序题目。
- CF762E Radio stations - 洛谷 (luogu.com.cn):三维偏序 \(O(n\log_2^2{n})\) 的做法中要维护绝对值。
- P4390 [BalkanOI 2007] Mokia 摩基亚 - 洛谷 (luogu.com.cn):偏模板的题,要把时间轴记下来作为第三维。
- P4027 [NOI2007] 货币兑换 - 洛谷 (luogu.com.cn):非常经典的三维偏序 DP。
- CF848C Goodbye Souvenir - 洛谷 (luogu.com.cn):三维偏序。
- P4093 [HEOI2016/TJOI2016] 序列 - 洛谷 (luogu.com.cn):三维偏序 DP。
- P4690 [Ynoi Easy Round 2016] 镜中的昆虫 - 洛谷 (luogu.com.cn):第三维是时间维,CDQ 分治可做,但是需要卡常,或者使用分块亦可。内层搭配珂朵莉树。
- P4793 [AHOI2008] 矩形藏宝地 - 洛谷 (luogu.com.cn):四维偏序优化到三维。
四维偏序
实现方法
- CDQ 套 CDQ(包括 CDQ 套 CDQ 套 CDQ):比较常见的方法,复杂度 \(O(n\log^3{n})\)。
- 树套树套树:非常可怕的空间复杂度……
- 分组
bitset:比较合适。 - K-D Tree:可以做到 \(O(n^{\frac{5}3})\)。
- 树状数组套 K-D Tree:神奇的四维偏序 - 洛谷专栏 (luogu.com.cn),时间 \(O(n^{\frac{3}2})\),空间 \(O(n\log{n})\)。
- 分块:题解:P3769 [CH弱省胡策R2] TATT - 洛谷专栏 (luogu.com.cn),时间 \(O(n^{\frac{3}2})\),空间 \(O(n)\)。
例题
- Problem - 5126 (hdu.edu.cn):四维偏序模板题,三维坐标,一维时间。
- P5621 [DBOI2019] 德丽莎世界第一可爱 - 洛谷 (luogu.com.cn):四维偏序 DP。
- P3769 [CH弱省胡策R2] TATT - 洛谷 (luogu.com.cn):四维偏序 DP。
高维偏序
实现方法
bitset 求解高维偏序 - -Wallace- - 博客园 (cnblogs.com)。
到了 \(5\) 维甚至更高的偏序问题,bitset 无疑是首选,而且还可以优化空间。
例题
- HihoCoder #1513 小Hi的烦恼:https://hihocoder.com/problemset/problem/1513。(五维偏序)
- HihoCoder #1236 Scores:http://hihocoder.com/problemset/problem/1236。(七维偏序)
超高维偏序
实现方法
这类题目通常是用于状压、二进制枚举。解决方法有高维前缀和、SOS DP 等。
例题
- CF165E Compatible Numbers - 洛谷 (luogu.com.cn):高维前缀和模板题。
- AT_arc100_c [ARC100E] Or Plus Max - 洛谷 (luogu.com.cn):高维前缀和模板题。
- CF1208F Bits And Pieces - 洛谷 (luogu.com.cn):不怎么难的 DP。
细节
- 偏序问题的排序较容易出错,注意各维度的定义、询问与修改的前后顺序。
- 分治时,有的地方复杂度容易算错,要仔细分析。

浙公网安备 33010602011771号