Loading docs/misc/cdq-divide.md +3 −3 Original line number Diff line number Diff line Loading @@ -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$ 分治去优化它的转移过程呢? Loading @@ -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)$ 的中间,为什么呢? Loading Loading @@ -445,7 +445,7 @@ int main() { 什么意思呢? 众所周知的是有些数据结构题需要我们兹次做 xxx 修改然后做 xxx 询问的情况 众所周知的是有些数据结构题需要我们支持做 xxx 修改然后做 xxx 询问的情况 然后你会发现一个有趣的事实是如果我们把询问进行离线之后,所有操作按照时间自然的排成了一个序列,另一个比较显然的事实是每一个修改会对它之后的询问发生关系,而这样的修改 - 询问关系一共会有 $O(n^2)$ 对 Loading Loading
docs/misc/cdq-divide.md +3 −3 Original line number Diff line number Diff line Loading @@ -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$ 分治去优化它的转移过程呢? Loading @@ -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)$ 的中间,为什么呢? Loading Loading @@ -445,7 +445,7 @@ int main() { 什么意思呢? 众所周知的是有些数据结构题需要我们兹次做 xxx 修改然后做 xxx 询问的情况 众所周知的是有些数据结构题需要我们支持做 xxx 修改然后做 xxx 询问的情况 然后你会发现一个有趣的事实是如果我们把询问进行离线之后,所有操作按照时间自然的排成了一个序列,另一个比较显然的事实是每一个修改会对它之后的询问发生关系,而这样的修改 - 询问关系一共会有 $O(n^2)$ 对 Loading