CDQ分治详解

CDQ分治是一种高效解决逆序对、二维偏序和三维偏序问题的方法。通过归并排序,CDQ分治可以在处理逆序对时,利用已排序的性质快速统计。对于二维偏序,它可以直接应用到归并排序的第二维。在处理三维偏序时,结合树状数组,可以达到O(nlognlogm)的时间复杂度。此外,CDQ分治还可用于离线分治处理多维度的询问和修改问题,如Luogu P3810和P4390等题目。
摘要由CSDN通过智能技术生成

CDQ分治

归并排序

在讨论 CDQ 分治之前,我们先说说归并排序

相信归并排序大家都知道(不会的往这里走 归并排序),如果是对 A [ l . . . r ] A[l...r] A[l...r] 排序,我们可以利用分治算法,设 m i d = ( l + r ) / 2 mid=(l+r)/2 mid=(l+r)/2,分别将左半部分 A [ l . . . m i d ] A[l...mid] A[l...mid] 和右半部分 A [ m i d + 1... r ] A[mid+1...r] A[mid+1...r] 排序,再合并两个子数组,时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)

逆序对

如果要求逆序对(指当 i < j , A [ i ] > A [ j ] i<j,A[i]>A[j] i<j,A[i]>A[j] ( i , j ) (i,j) (i,j) 的对数)呢?其实,归并排序可以完美化解这个问题。

如果我们仅算 A [ l . . . r ] A[l...r] A[l...r] 中的逆序对,是不是在分治的过程中, A [ l . . . m i d ] A[l...mid] A[l...mid] A [ m i d + 1... r ] A[mid+1...r] A[mid+1...r] 各自内部的逆序对已经算完了?所以我们在合并的时候只用算左半部分和右半部分各取一个数,组成逆序对的对数了。

考虑合并 A [ l . . . m i d ] A[l...mid] A[l...mid] A [ m i d + 1... r ] A[mid+1...r] A[mid+1...r] 的两个指针 i = l . . m i d , j = m i d + 1... r i=l..mid,j=mid+1...r i=l..mid,j=mid+1...r。当 A [ i ] > A [ j ] A[i]>A[j] A[i]>A[j] 时,因为 A [ l . . . m i d ] A[l...mid] A[l...mid] 都已经排好序了,是不是 A [ i . . . m i d ] A[i...mid] A[i...mid] 都是大于 A [ j ] A[j] A[j] 的?所以 i . . . m i d i...mid i...mid j j j 构成了 m i d − i + 1 mid-i+1 midi+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值