Unverified Commit 78baf19e authored by ir1d's avatar ir1d
Browse files

style: update format

parent 547d4ef8
Loading
Loading
Loading
Loading
+25 −25
Original line number Diff line number Diff line
@@ -27,11 +27,11 @@ $CDQ$ 分治本身很好理解,只是复杂度有点玄学而已。

其实都可以用权值线段树或者树状数组来完成此类问题, 这里来讲一下 $CDQ$ 分治。 $CDQ$ 分治和其它数据结构差不多, 几乎都是每多一维, 时间复杂度多个 $log\ n$。那么二维偏序直接用树状数组, 这里不多说。

$CDQ$ 大体可以认为是 先算出 $l$~$mid$ 的贡献,然后算出 $l$$r$ 的贡献,最后再算 $mid$~$r$ 的贡献。对于 $l$~$mid$ 和 $mid$~$r$ 的贡献,可以直接 $CDQ(l,mid),CDQ(r,mid)$。为什么呢?因为分治以后它们会对自己的 $l$~$r$ 算自己的贡献,所以这样子木有问题。现在讨论的重点就是如何求出 $l$~$r$ 的贡献。
$CDQ$ 大体可以认为是 先算出 $l \cdots mid$ 的贡献, 然后算出 $l$$r$ 的贡献, 最后再算 $mid \cdots r$ 的贡献。对于 $l \cdots mid$ 和 $mid \cdots r$ 的贡献, 可以直接 $CDQ(l,mid),CDQ(r,mid)$。为什么呢? 因为分治以后它们会对自己的 $l \cdots r$ 算自己的贡献, 所以这样子木有问题。现在讨论的重点就是如何求出 $l \cdots r$ 的贡献。

三维偏序问题: 偏序问题的第一维,我们是直接排序的。注意要按第 $1$ 个数组为第 $1$ 关键字,第 $2$ 个为第 $2$ 个关键字 $.....$。然后我们就可以保证整个数组 $a[i]\leq a[j]\ (i\leq j)$。我们现在有一个区间 $l,r$ ,我们先 $CDQ(l,mid)$。随后我们给 $l,r$ 这个区间进行编号, $num[i]:=i$(这个时候 $num$ 为编号)。我们再用一个数组 $element[l$~$r]$ 为 $l$~$r$ 的 $b[i]$,然后进行 $Sort(l,r)$。其中 $element$ 为第一关键字, $num$ 为第二关键字。
三维偏序问题: 偏序问题的第一维, 我们是直接排序的。注意要按第 $1$ 个数组为第 $1$ 关键字, 第 $2$ 个为第 $2$ 个关键字 $.....$。然后我们就可以保证整个数组 $a[i]\leq a[j]\ (i\leq j)$。我们现在有一个区间 $l,r$ , 我们先 $CDQ(l,mid)$。随后我们给 $l,r$ 这个区间进行编号, $num[i]:=i$(这个时候 $num$ 为编号)。我们再用一个数组 $element[l \cdots r]$ 为 $l \cdots r$ 的 $b[i]$, 然后进行 $Sort(l,r)$。其中 $element$ 为第一关键字, $num$ 为第二关键字。

最后循环扫一遍,因为这个时候后已经满足 $b[i]\leq b[j]\ (i\leq j)$。我们就可以按照逆序对这样子,对权值线段树(树状数组)插入第三维 $c[i]$。如果 $num[i]\leq mid$ 的话,我们就插入,否则算贡献。为什么这样子呢?因为现在满足的是 $b[i]\leq b[j]\ (i\leq j)$ ,而 $num[i]\leq mid$ 可以满足 $a[l$~$mid]\leq a[mid+1$~$r]$,我们只需要对 $c$ 数组进行逆序对一样的操作。
最后循环扫一遍, 因为这个时候后已经满足 $b[i]\leq b[j]\ (i\leq j)$。我们就可以按照逆序对这样子, 对权值线段树 (树状数组) 插入第三维 $c[i]$。如果 $num[i]\leq mid$ 的话, 我们就插入, 否则算贡献。为什么这样子呢? 因为现在满足的是 $b[i]\leq b[j]\ (i\leq j)$ , 而 $num[i]\leq mid$ 可以满足 $a[l .. mid]\leq a[mid+1 .. r]$, 我们只需要对 $c$ 数组进行逆序对一样的操作。

```pascal
procedure CDQ(l,r:longint);
@@ -61,6 +61,6 @@ begin
end;
```

$a[l$~$mid]\leq a[mid+1$~$r]$ 是只能算出 $l$ 对 $r$ 的贡献的,所以就需要分治啦。最后别忘了还原树状数组和 $CDQ(mid+1,r)$!!! 加上树状数组时间复杂度 $O(n\ (log\ n)^2)$。
$a[l..mid]\leq a[mid+1..r]$ 是只能算出 $l$ 对 $r$ 的贡献的, 所以就需要分治啦。最后别忘了还原树状数组和 $CDQ(mid+1,r)$!!! 加上树状数组时间复杂度 $O(n\ (log\ n)^2)$。

三维偏序就如此, 谢谢大家。