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)

posted @ 2024-11-25 18:26  花子の水晶植轮daisuki  阅读(1)  评论(0编辑  收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js