分治算法的基本思想是将一个规模为n的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解. --陈丹琦集训队论文
例如归并排序
复杂度分析(可是我并不会分析
oT(n) = 2 * T(n / 2) + O(kn)=O(kn*logn)
oT(n) = 2 * T(n / 2) + O(k) = O(kn)
cdq分治是一种特殊的分治方法,初见于陈丹琦08年集训队论文
适用条件:
1.允许离线算法
2.修改操作对答案的贡献相互独立,修改操作间互不影响
模型:
Solve(l, mid)
(l, mid)对于(mid+1, r)的影响
Solve(mid + 1, r)
首先看一道三维偏序裸CDQ题
所以简单来说 cdq分治是把询问和修改一起操作,用[l,mid]中的修改更新[mid+1,r]中的询问。
接下来稍微要转化一下的题
二维前缀和+时间序+树状数组维护y
这道题用到了cdq的常用处理方法 时间序因为对时间为i的询问有影响的修改的时间一定小于i,所以可以在时间序上进行分治。
还是一道时间序的题,做法比较有趣
时间序+树状数组维护max(x+y)
用了时间维度的非典型CDQ
bzoj 4137 http://www.cnblogs.com/lokiii/p/8125912.html(莫名插不进去链接
用分治推掉外层线段树
lazy:
hdu 5127 还不会凸包