OSDN Git Service

Update cdq-divide.md
authorhsfzLZH1 <34390285+hsfzLZH1@users.noreply.github.com>
Tue, 2 Oct 2018 11:29:25 +0000 (19:29 +0800)
committerGitHub <noreply@github.com>
Tue, 2 Oct 2018 11:29:25 +0000 (19:29 +0800)
减少了公式的滥用

规范了表述

修正了 $\log^2 n$ 写成 $(\log\ n)^2$ 的问题

docs/misc/cdq-divide.md

index a724cba..47afbab 100644 (file)
@@ -1,6 +1,6 @@
-### 使用 $CDQ$ 实现偏序问题
+### 使用 CDQ 实现偏序问题
 
-$CDQ$ 分治本身很好理解, 只是复杂度有点玄学而已。
+CDQ 分治本身很好理解, 只是复杂度有点玄学而已。
 
 ### 逆序对问题
 
@@ -25,9 +25,9 @@ $CDQ$ 分治本身很好理解, 只是复杂度有点玄学而已。
 
 ### 如何解决问题
 
-其实都可以用权值线段树或者树状数组来完成此类问题, 这里来讲一下 $CDQ$ 分治。 $CDQ$ 分治和其它数据结构差不多, 几乎都是每多一维, 时间复杂度多个 $log\ n$。那么二维偏序直接用树状数组, 这里不多说。
+其实都可以用权值线段树或者树状数组来完成此类问题, 这里来讲一下 CDQ 分治。 CDQ 分治和其它数据结构差不多, 几乎都是每多一维, 时间复杂度多个 $log\ n$。那么二维偏序直接用树状数组, 这里不多说。
 
-$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$ 的贡献。
+CDQ 的思想大体可以认为是 先算出 $l \cdots mid$ 的贡献, 然后算出 $l$ 对 $r$ 的贡献, 最后再算 $mid \cdots r$ 的贡献。对于 $l \cdots mid$ 和 $mid \cdots r$ 的贡献, 可以直接用分治的思想递归求解左右两个区间 $[l,mid]$ 和 $[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 \cdots r]$ 为 $l \cdots r$ 的 $b[i]$, 然后进行 $Sort(l,r)$。其中 $element$ 为第一关键字, $num$ 为第二关键字。
 
@@ -59,6 +59,6 @@ void CDQ(int l,int r) {
 }
 ```
 
-$a[l \cdots mid]\leq a[mid+1 \cdots r]$ 是只能算出 $l$ 对 $r$ 的贡献的, 所以就需要分治啦。最后别忘了还原树状数组和 $CDQ(mid+1,r)$!!! 加上树状数组时间复杂度 $O(n\ (log\ n)^2)$
+$a[l \cdots mid]\leq a[mid+1 \cdots r]$ 是只能算出 $l$ 对 $r$ 的贡献的, 所以就需要分治啦。最后别忘了还原树状数组和递归计算两侧区间的答案! 加上树状数组时间复杂度 $O(n\log^2 n)$ 
 
 三维偏序就如此, 谢谢大家。