三维偏序(陌上花开)

具体的题解就看OI-wiki上面的就好了,但是对上面的题解做一些解释

题解首先说按照a排序,其实是按照a为第一关键字,b为第二关键字,c为第三关键字排序再离散化

为什么要这么做?我们来看一下CDQ分治的具体过程

solve(l,mid)solve(mid+1,r)解决完后,我们只需要解决点对(i,j)的问题(我们枚举的是j,计算的是f(j)),其中i属于[l,mid]j属于[mid+1,r]或者i属于[mid+1,r]j属于[l,mid]

我们先来看前一种情况,这种情况就看OI-wiki就好了,上面除了打成了没啥错

然后来看第二种情况,由于我们最开始的排序和离散化,此时不可能存在一个数对(i,j)使得ajai,bjbi,cjci,所以根本不用考虑第二种情况(所以题解说的离散化是保证时间复杂度的,其实不尽然,其实是保证正确性的);如果最开始只是按照ai为关键字排序,可能在某次solve的区间[l,r]中,原序列(指最开始按照ai排序之后的[l,r]而不是在solve递归之后已经经过bi排序后的数组)[x,mid][mid+1,y]的元素的a是相等的,因此第二种情况是可能存在的,但是却没有办法统计了(所以说离散化是保证正确性的,当然这里保证正确性就是保证时间复杂度)

然后注意最后统计答案的时候,由于我们离散化了,是没有办法统计三个属性值相等的元素之间的互相影响的,因为最后的下标不是ue.res,而是ue.res+ue.cnt1

update 2024.7.18

其实单纯按照a排序也可以,最后要单独统计一下上面说的特殊情况而已,可知时间复杂度并不会变化

posted @   最爱丁珰  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示