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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具