分治片段

cdq分治是一种特殊的分治,在有些时候可以代替复杂的数据结构来解决一些问题。

今天刚学了cdq分治,在这里以HDU1166为例(本来是树状数组或者线段树的模板题),来说一下我对cdq的理解。

首先说一下cdq分治的优点,就是比好写(相对于某些数据结构),可以维护一些dp(暂时还不会)

缺点是,要求题目的询问可以转化为离线处理。

下面是一般cdq分治的大致步骤:

1,将所有的操作(询问操作或者查询操作)先按照一个标准排序从左到右依次为[L , R](下面这道题按默认的时间顺序,所以不需要做任何操作)

2,将区间[L, R]分为两部分分别是区间[L, mid],[mid + 1, R],其中mid = (L + R) / 2;

3,先递归处理这两个区间。

4,枚举区间[L,mid]中的修作操作会对区间[mid + 1,R]中查询操作造成的影响。


CDQ分治(陈丹琦分治)的思想就是降维

先来看个题:

1.在数轴上(1~1e9),初始化每点为0。两种操作:1 a  b(将点a加b),2 a b(询问区间a—b值的总和)。

很快会想到线段树或树状数组,因为区间过大,所以离线化一下就好了,这里因为前缀和需要,说以我们就使用树状数组。先把操作2才分开记录下询问的id编号,这个询问的答案就是两个前缀和相减,这里我们来深层的挖一下这么做的原因:其实这里有两个维度:位置x和时间t,时间t是按输入顺序自动排序好的,所以我们容易忽视时间t维度,其实时间维度与位置维度是完全一样的,我们不妨按位置x排序(同样把操作2分开,操作1和操作2丢在一起排),按时间t来树状数组,也会得到正确答案。这是为什么呢?因为不管我们是按位置做排序时间做树状数组,还是按时间排序按位置做树状数组,都是得到的两个维度前缀和的相交部分(可能解释得不太到位0.0,请见谅)。

总结上面这题,就是:时间t维度和位置x维度,一个维度排序,另一个维度用树状数组。

此时进入正题,再来看一题:

2.在平面上,(x,y:1~1e9),初始化每点为0。两种操作:1 a b c(将点a,b加c),2 a1 b1 a2 b2(询问矩形区域a1,b1—a2,b2值的总和)。

很快就会想到二维线段树或二维树状数组再加个离散化,但是如果询问次数大于10000,离散化后可能还要开20000*20000的空间,所以最多只能开一维的树状数组,参考上一题的降维解法,这一题有3个维度:时间t 位置x 位置y,我们二分t维度,排序x维度,树状数组y维度,就可以成功降维了。

总结上面这题:通过二分,排序,树状数组降维。

分析上面这题:每个维度是可以前缀思想来处理的 才可以用这个方法!因为只有这样,前面的修改操作才会有且仅有一次地影响到后面的查询操作(可能解释得不太到位0.0,请见谅)。

下面再来看一题:

3.在空间上,(x,y,z:1~1e9),初始化每点为0。两种操作:1 a b c d(将点a,b,c加d),2 a1 b1  c1 a2 b2 c2(询问长方体区域a1,b1,c1—a2,b2,c2值的总和)。

参考上面一题降维解法,这一题有4个维度:时间t 位置x 位置y位置z,我们二分t维度,二分x维度,排序y维度,树状数组z维度,就可以成功降维了。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值