window.cnblogsConfig = { homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

CDQ分治

CDQ分治

它是一种非常巧妙地方法。

用分治的思想处理三维偏序一类的问题:

处理的问题如下:模板

n 个元素,第 i 个元素有 ai,bi,ci 三个属性,设 f(i) 表示满足 ajaibjbicjcijij 的数量。

对于 d[0,n) ,求 f(i)=d 的数量。

也就是对于每一个三元组 i 看有多少个完全小于他的三元组 j

数据范围 n2×105

显然暴力会不过去。

只能考虑一些 nlognnlog2n 的做法。

首先,先把第一维排序了。

这样,只用考虑 bici 了。

那我们考虑如何处理 bi

类似归并的方法,分而治之,分治。就是对于 [l,r] 的子区间我们先处理 [l,mid][mid+1,r] 两个区间,然后将其 O(rl) 的时间复杂度合并。很简单的策略,分别在两个子区间内放两个指针,那边小就加入那边,因为如果 Ai 他是比 Bj 小的,那么 A 目前也排序了,所以也是 A 中最小的,也就是 AB 合并后最小的,因此直接判断然后去加即可。

这样,bi 也处理好了,我们就可以用树状数组维护一下 ci 的数量,然后就可以求出此时比 ci 小的 cj 有多少个,由于在线处理,所以说,之前出现的 aibi 都是应该符合小于现在的这个三元组的。

于是,在线(边跑边记录)处理完之后,再依次输出答案。

int n,k,m; struct node{int a,b,c;}; struct data{node a;int cnt,ans;}; node a[N]; struct data b[N]; int t[N<<1]; void add(int x,int val){while(x<=k)t[x]+=val,x+=(x&-x);} int query(int x){int res=0;while(x)res+=t[x],x-=(x&-x);return res;} bool node_cmp(node a,node b){ if(a.a != b.a) return a.a<b.a; if(a.b != b.b) return a.b<b.b; return a.c<b.c; }bool data_cmp(struct data a,struct data b){ if(a.a.b != b.a.b) return a.a.b<b.a.b; return a.a.c<b.a.c; }void cdq(int l,int r){ if(l==r)return ; int mid=(l+r)>>1,x=l; cdq(l,mid),cdq(mid+1,r); sort(b+l,b+1+mid,data_cmp),sort(b+1+mid,b+1+r,data_cmp); For(i,mid+1,r){ while(x<=mid&&b[x].a.b<=b[i].a.b) add(b[x].a.c,b[x].cnt),x++; b[i].ans+=query(b[i].a.c); }For(i,l,x-1){ add(b[i].a.c,-b[i].cnt);//清空还原操作 } }int ans[N]; void solve(){ cin>>n>>k; For(i,1,n)cin>>a[i].a>>a[i].b>>a[i].c; sort(a+1,a+1+n,node_cmp); For(i,1,n){ if(a[i].a!=a[i-1].a||a[i].b!=a[i-1].b||a[i].c!=a[i-1].c) b[++m].a=a[i]; b[m].cnt++; } cdq(1,m); For(i,1,m)ans[b[i].ans+b[i].cnt]+=b[i].cnt; For(i,1,n)cout<<ans[i]<<endl; }

__EOF__

本文作者gsczl71
本文链接https://www.cnblogs.com/gsczl71/p/18156173.html
关于博主:GDSZ初一蒟蒻,明年拿下七级勾
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   gsczl71  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示