Unverified Commit 5ad91d34 authored by Shuhao Zhang's avatar Shuhao Zhang Committed by GitHub
Browse files

Merge pull request #2598 from rtxu/master

fix typos about (i, j) pairs
parents 3d480803 34c76588
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ int main() {

*如果你足够熟练的话可以看出这就是一个二维最长上升子序列的 $dp$ 方程*

解释一下上面的式子就是说只有 $i<j,a_{i}<a_{j},b_{i}<b_{j}$ 的点 $j$ 可以去更新点 $i$ 的 dp 值
解释一下上面的式子就是说只有 $j<i,a_{j}<a_{i},b_{j}<b_{i}$ 的点 $j$ 可以去更新点 $i$ 的 dp 值

直接转移显然是 $O(n^2)$ 的,我们如何使用 $cdq$ 分治去优化它的转移过程呢?

@@ -226,7 +226,7 @@ int main() {

那么第二步怎么做呢?

其实和 cdq 分治求三维偏序差不多,我们会发现处理 $l \leq j \leq mid,mid+1 \leq i \leq r$ 的转移关系的时候我们已经不用管 $j<i$ 这个限制条件了,因此我们依然是将所有的点 $i$ 和点 $j$ 按 $a$ 值进行排序处理之后用双指针的方式将 $j$ 点插入到树状数组里,然后最后查一前缀最大值更新一下 $dp_{i}$ 就可以了
其实和 cdq 分治求三维偏序差不多,我们会发现处理 $l \leq j \leq mid,mid+1 \leq i \leq r$ 的转移关系的时候我们已经不用管 $j<i$ 这个限制条件了,因此我们依然是将所有的点 $i$ 和点 $j$ 按 $a$ 值进行排序处理之后用双指针的方式将 $j$ 点插入到树状数组里,然后最后查一前缀最大值更新一下 $dp_{i}$ 就可以了

你会发现此时的 cdq 写法和上一种处理点对间关系的 cdq 写法最大的不同就是处理 $l \leq j \leq mid,mid+1 \leq i \leq r$ 的点对这一部分,上面的写法中这一部分我们放到哪里都是可以的,但是,在用 cdq 分治优化 dp 的时候这个流程却必须夹在 $solve(l,mid),solve(mid+1,r)$ 的中间,为什么呢?

@@ -445,7 +445,7 @@ int main() {

什么意思呢?

众所周知的是有些数据结构题需要我们兹次做 xxx 修改然后做 xxx 询问的情况
众所周知的是有些数据结构题需要我们支持做 xxx 修改然后做 xxx 询问的情况

然后你会发现一个有趣的事实是如果我们把询问进行离线之后,所有操作按照时间自然的排成了一个序列,另一个比较显然的事实是每一个修改会对它之后的询问发生关系,而这样的修改 - 询问关系一共会有 $O(n^2)$ 对