CDQ分治
CDQ分治
有n个元素,第 i个元素有ai,bi,ci三个属性,设 f(i) 表示满足 aj ≤ ai且 bj ≤ bi 且 cj ≤ ci且 j != i 的 j 的数量。
求f数组。
解决三维偏序的流程:
同样有归并排序和树状数组两种做法,我们这里给出树状数组做法。
先按一维属性排序和去重
1.假设三维分别是x,y,z,先按x排序。
2.然后去掉重复元素,记录每个元素出现的次数cnt
CDQ分治:类似归并排序的思想,先按第一维属性划分为前一半和后一半,回归时计算前一半对后一半的影响
分治后每次将前一半、后一半分别按y排序。虽然现在x的顺序被打乱了,但是前一半的x还是都小于后一半的,所以只计算前一半对后一半的偏序关系,是不会受到x影响的。
用双指针 i,j来维护前一半和后一半,每次将j后移一位时,若y[i] <= y[j],则不断后移i,并不断将z[i]加入树状数组。然后再查询树状数组中有多少数<=z[j],即<= e[j]的偏序数量。
最后要清空树状数组。
时间复杂度O(nlog^2n)