OSDN Git Service

Update cdq-divide.md
authorhsfzLZH1 <34390285+hsfzLZH1@users.noreply.github.com>
Wed, 3 Oct 2018 10:53:45 +0000 (18:53 +0800)
committerGitHub <noreply@github.com>
Wed, 3 Oct 2018 10:53:45 +0000 (18:53 +0800)
docs/misc/cdq-divide.md

index 23801d6..4857777 100644 (file)
@@ -8,7 +8,7 @@ CDQ 分治本身很好理解, 只是复杂度有点玄学而已。
 
 每加入一个数字, 我们可以把这个数字插入到权值线段树中, 如下:
 
-![](./images/cdq-divide1.png)
+![](./images/CDQ-1.png)
 
 当到第 $i$ 个数字的时候, 我们就可以直接在权值线段树中查询 $num[i] \cdots max$ (其中 $max$ 为 $1 \cdots i-1$ 最大的值)。这就是第 $i$ 个数的贡献。查询完以后记得要继续插入此数。
 
@@ -80,15 +80,15 @@ $a[l \cdots mid]\leq a[mid+1 \cdots r]$ 是只能算出 $l$ 对 $r$ 的贡献的
 
 再想一下 CDQ 分治的思想, 我们可不可以求左半边对右半边的贡献呢? 先假设一个区间 $l,r$, 假如 $l$ 到 $mid$ 的操作都是在 $mid+1$ 到 $r$ 前面做的 (也就是左半边所有的时间都小于右半边的时间), 那么 $l$ 到 $mid$ 的修改必定会影响到 $mid+1$ 到 $r$ 的查询。
 
-![](https://s1.ax1x.com/2018/09/08/iPaVAI.png)
+![](./images/CDQ-2.png)
 
 而我们把所有的查询 $L,R$ 的值变为 $1,R$ 的值减去 $1,L-1$ 的值, 那么所有的查询的起点都是 $1$。这个时候我们判断是否有贡献的时候, 我们就拿右端点 (修改的只有一个点, 也视其为右端点) 来判断, 修改的右端点小于查询的右端点, 那么肯定是对查询有贡献的。(黑色的是加的, 红色的是减去的, 剩下的黄色就是目标区间)
 
-![](https://i.loli.net/2018/09/15/5b9c82c0adb8d.png)
+![](./images/CDQ-3.png)
 
 那是左半边所有的修改都会影响到右半边所有的贡献吗? 并不是。
 
-![](https://s1.ax1x.com/2018/09/08/iPaGEn.png)
+![](./images/CDQ-4.png)
 
 (注意,$time$ 为操作的时间,$point$ 为右端点的位置,$mode$ 为查询 (Q) 或者修改 (C)。以下的 $n$ 为操作的总数, 包括把查询拆分和原序列)
 
@@ -153,7 +153,7 @@ end;
 
 第一步, 我们把查询看做是一个二维前缀和的查询。也就是说, 我们对于 $x,y,x1,y1$ 的查询, 看做全部以 $1$ 开始的矩阵, 如下图 : (黑色的是加的, 红色的是减去的, 剩下的黄色就是目标矩阵)
 
-![](https://i.loli.net/2018/09/15/5b9c83b75cb73.png)
+![](./images/CDQ-5.png)
 
 现在问题从原来的一个右端点变成了两个右端点, 但是贡献还是相同的, 且有一个。假如两个点 $x_i,y_i$,$x_i$ 已经满足 $\leq x_j$, 那么我们就只需要看 $y_i$ 对 $y_j$ 怎么样。这时候我们用一个树状数组 (权域) 来维护一下,
 每一次左半边有修改的时候更新一下树状数组, 每当右半边有点可以满足当前的左半边的点的时候 ($left,right$), 就统计右边的点的第二个右端点 ($right_y$) 的前面有多少个左半边的点 ($1_y~left_y$) 的第二个右端点。