玄学算法CDQ分治

本文介绍了CDQ分治算法在处理具有单调性的题目时的应用,以最长上升子序列为例,阐述如何将暴力枚举优化为线性时间复杂度。通过排序和对前缀和的处理,将问题复杂度降低到n*log n。此外,还讨论了如何应对二维条件,提出使用树状数组进一步优化问题。
摘要由CSDN通过智能技术生成

啊刚学这个啊
刚过了一道题就屁颠屁颠来写博客很虚啊
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这个位置最小和最大可能变成的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值