偏序问题专题

偏序问题专题


前言

在 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\) 满足偏序关系,因此得名“偏序问题”。

拓展

在此基础上,该问题还可以延伸。

  1. 条件:

    只有 \(\le\) 实在太单一,还可以使用 \(<,>\) 等拟序关系。

    或者用更复杂的关系,比如在树上的位置关系,在图上的位置关系,在数据结构上的位置关系等。

  2. 内容:

    我们可能不是统计满足条件的点的个数,还有可能是位置、最值等。

方法

当我们看到偏序问题,就可以想到枚举每一维来解决这个问题,这样的复杂度可以达到 \(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 优化,与其他数据结构结合,优化卷积等。

二维偏序

实现方法

  • 扫描线:通常二维偏序的解法是一维排序,另一维数据结构维护,这个算法被形象地称为“扫描线”。
  • 分治:分治其实也是一种解决二维偏序的常用方法,它通常需要结合双指针来解决。由于数据提前排好了序,分治左区间的第一维与分治右区间的第一维肯定满足偏序关系,那么我们只需要求解第二维即可。

例题

三维偏序

实现方法

  • CDQ 分治(包括 CDQ 分治套 CDQ 分治):最最常见的三维偏序做法,常数较小,也不复杂,可以与归并结合,还有一些可以使用的技巧。
  • 树套树:一般的在线三维偏序方法,通常使用树状数组套值域线段树为多。
  • K-D Tree、分块、莫队:根号做法。
  • 分组 bitset:适合高维偏序,常数小,大概只有 \(O(\frac{n^2d}w)\)\(d\) 是维数)。
  • 二进制分组套 Wavelet Matrix:单 \(\log\) 做法……

例题

四维偏序

实现方法

例题

高维偏序

实现方法

bitset 求解高维偏序 - -Wallace- - 博客园 (cnblogs.com)

到了 \(5\) 维甚至更高的偏序问题,bitset 无疑是首选,而且还可以优化空间。

例题

超高维偏序

实现方法

这类题目通常是用于状压、二进制枚举。解决方法有高维前缀和、SOS DP 等。

例题

细节

  • 偏序问题的排序较容易出错,注意各维度的定义、询问与修改的前后顺序。
  • 分治时,有的地方复杂度容易算错,要仔细分析。
posted @ 2025-11-19 19:42  Add_Catalyst  阅读(17)  评论(0)    收藏  举报