二维偏序问题
偏序问题的概念
设 R R R是集合 A A A上的一个二元关系,若 R R R满足:
- 自反性:对任意 x ∈ A x∈A x∈A,有 x R x xRx xRx
- 反对称性(即反对称关系):对任意 x , y ∈ A x,y∈A x,y∈A,若 x R y xRy xRy,且 y R x yRx yRx,则 x = y x=y x=y
- 传递性:对任意 x , y , z ∈ A x, y,z∈A x,y,z∈A,若 x R y xRy xRy,且 y R z yRz yRz,则 x R z xRz xRz
则称 R R R为 A A A上的偏序关系,通常记作 ≼ ≼ ≼。注意这里的 ≼ ≼ ≼不必是指一般意义上的“小于或等于”
若然有 x ≼ y x≼y x≼y,我们也说 x x x排在 y y y前面(x precedes y)
二维偏序问题通解
对于二维偏序问题,我们通常使用树状数组进行解决。关于树状数组的介绍,我在前面已经写过
将一组数据进行排序,再将另一组数据离散化后,按题意分情况压入树状数组,求前缀和,这是二维偏序问题的一般解法。
下面我们看几道例题
POJ2352
这道题按 y y y为第一关键词, x x x为第二关键词进行了排序,随后将x压入树状数组后,得到的前缀和表示比 x x x小的元素个数,而 a n s ans ans则会记录比 x x x小且比 y y y小的元素个数。代码如下
void solve() {
int n, x;
cin>>n;
Fenwick tree = Fenwick(MAX);
vector<int> ans(n);
for (int i = 0, i