「刷题」分治

  分治,大多复杂度在$ O(log_2n) $ 级别,因为每次递归把大小减半,所以最多$ log_2n $层,今天做的点分和$CDQ$都是这样的。

  先总结一下$CDQ$,很强的数据结构,不知道陈丹琦怎么做到$ noi $现场$yy$这么一个数据结构出来实在是$TQL$,昨天学过了之后今天上午11点左右才开始做题,找了几个板子刷了一下,然后写了自己的板子。

  主要思想就是以时间为轴,进行分治,不断递归子问题,最终得到一个不可分割的可以立刻得到解的子问题,但是和普通的分治不一样。普通的分治必须满足每一个子问题是和原问题解决方法相同,结构相同的子结构。而$ CDQ $分治不一样,她计算的时候分别计算左右区间,再加上跨越中点的代价或者贡献进行合并,得出子结构的解,从而完成一次递归,这样可以解决不可分割的具有整体性的区间问题。

  大多数时候$ CDQ $分治适用于三维偏序问题。

  现在说一下怎么实现的,$ CDQ $分治又被称基于时间的分治算法,一般都是以各种操作的时间顺序为轴进行分治,这里满足分治的先后顺序,就可以直接计算左区间对右区间的影响,从而达到跨区间计算贡献的目的。

  那么第一维就是时间了。第二维可以靠单调指针扫描解决,第三维就需要树状数组等类似的数据结构来维护,所以三维偏序问题的时间复杂度一般都是$ O(nlog_2^2n) $ ,一些优化就是第二维可以利用归并排序的思想进行维护,从而减去很大的常数。

  说一下$CDQ$分治优化$dp$。

  一般情况下的$CDQ$都是先递归左右区间再处理当前区间。但是优化$dp$一般都是先处理左区间,然后处理中间区间,再处理右区间,这样可以让后面的$dp$值被已经更新过的$dp$值更新,从而保证$dp$的正确性。

  对于一个形如:

    $dp[i]=\max \limits_{a_i \leq a_j}^{b_i \leq b_j}\{dp[j]\}+1$

猜你喜欢

转载自www.cnblogs.com/Lrefrain/p/11252935.html