啊刚学这个啊
刚过了一道题就屁颠屁颠来写博客很虚啊
bzoj4553
就是这道题
说一下我对CDQ分治的理解
我感觉。。这个就类似于。。把暴力,转化为。。容易优化的暴力。。然后优化??
并且一般只用于处理问题具有单调性的题,即f[i]对任意f[j](j={1..i},不产生影响。
例如最长上升子序列的问题
我们本来需要枚举这个j,但是通过CDQ分治就不需要去全部枚举了
我们处理1~n的时候,如果1~n/2已经全部处理完毕,那么就可以用1~n/2的结果去更新n/2+1~n的结果
注意 这里是更新,而不是算出
因为等会儿我们会枚举n/2+1~n/2+n/4去更新n/2+n/4+1~n
这样,f[i]就会被所有比他小的点更新
这里仍然举最长上升子序列的例子,暴力dp显然是n^2,然而上面说的这个想法,如果不加任何处理。。也是n^2,甚至常数更大
但是我们可以对前面的值进行一些处理,比如按照a[i]排序。
同时对后面的值处理,那么我们就可以线性推,把一次更新的时间优化到2(r-l),整个时间效率也就优化到了n*log n
那么再来看看看看一开始说的那道题,其实我们只要
,
a[i]<min[j]&&max[j]<a[i]
就可以类似于最长上升子序列一样n^2的dp了,其中min,max指j这个位置最小和最大可能变成的值