离线和简单分治

CDQ分治

【模板】三维偏序 —— bzoj3262

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+5,M=2e5+5;
 4 int n,k,cnt,c[M],ans[N];
 5 struct node {int x,y,z,w,k;}a[N],b[N];
 6 inline int read() {
 7     int x=0; char c=getchar();
 8     while(c<'0'||c>'9') c=getchar();
 9     while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
10     return x;
11 }
12 
13 int lowbit(int x) {return x&(-x);}
14 void update(int i,int x) {
15     for(;i<=k;i+=lowbit(i)) c[i]+=x; 
16 }
17 int query(int i) {
18     int h=0;
19     for(;i;i-=lowbit(i)) h+=c[i];
20     return h;
21 }
22 
23 bool cmp1(node x1,node x2) {
24     if(x1.x==x2.x) {
25         if(x1.y==x2.y) return x1.z<x2.z;
26         return x1.y<x2.y;
27     } return x1.x<x2.x;
28 }
29 bool cmp2(node x1,node x2) {return x1.y<x2.y;}
30 
31 void CDQ(int l,int r) {
32     if(l==r) return ;
33     int Mid=(l+r)>>1;
34     CDQ(l,Mid); CDQ(Mid+1,r);
35     sort(a+l,a+Mid+1,cmp2); sort(a+Mid+1,a+r+1,cmp2);
36     int j=l;
37     for(int i=Mid+1;i<=r;i++) {
38         while(j<=Mid&&a[j].y<=a[i].y)
39          update(a[j].z,a[j].w),j++;
40         a[i].k+=query(a[i].z);
41     }
42     for(int i=l;i<j;i++) update(a[i].z,-a[i].w);
43 }
44 
45 int main() {
46     n=read(),k=read();
47     for(int i=1;i<=n;i++)
48      b[i].x=read(),b[i].y=read(),b[i].z=read();
49     sort(b+1,b+n+1,cmp1); int t=0;
50     for(int i=1;i<=n;i++) {
51         t++;
52         if(b[i].x^b[i+1].x||b[i].y^b[i+1].y||b[i].z^b[i+1].z)
53          a[++cnt]=b[i],a[cnt].w=t,t=0;
54     }
55     CDQ(1,cnt);
56     for(int i=1;i<=cnt;i++)
57      ans[a[i].k+a[i].w]+=a[i].w;
58     for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
59     return 0;
60 }

 

转载于:https://www.cnblogs.com/qq8260573/p/11170144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值