分治法:三维偏序问题之CDQ分治

我怀疑那个k是用来定界限用的

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 struct edge{
 6     int x,y,z,ans,cnt;
 7 }   a[200050];
 8 int n,i,k,num,t;
 9 int tr[200050],f[200050];
10 int read(){
11     int sum=0;
12     char c=getchar();
13     while (c<'0'||c>'9') c=getchar();
14     while (c>='0'&&c<='9') {
15         sum=sum*10+c-'0';
16         c=getchar();
17     }
18     return sum;
19 }
20 bool cmp2(edge a,edge b) {
21     if (a.y==b.y) return a.z<b.z;
22       else return a.y<b.y;
23 }
24 bool cmp1(edge a,edge b) {
25     if (a.x==b.x) return cmp2(a,b);
26       else return a.x<b.x;
27 }
28 void add(int x,int y){
29     while (y<=t) {
30         tr[y]+=x;
31         y=y+(y&(-y));
32     }
33 }
34 int query(int y){
35     int s=0;
36     while (y>0) {
37       s+=tr[y];   
38       y=y-(y&(-y)); 
39     }
40     return s;
41 }
42 void cdq(int l,int r) {
43     if (l==r) return;
44     int mid=(l+r)>>1;
45     cdq(l,mid); cdq(mid+1,r);
46     sort(a+l,a+mid+1,cmp2);
47     sort(a+mid+1,a+r+1,cmp2);
48     int l1,t,i;
49     l1=l; 
50     for (i=mid+1;i<=r;i++){
51         while (a[i].y>=a[l1].y&&l1<=mid) {
52             add(a[l1].cnt,a[l1].z);
53             l1++;
54         }
55         a[i].ans+=query(a[i].z);
56     }   
57 //  if (l1==mid) l1++;
58     for (i=l;i<=l1-1;i++)
59       add(-a[i].cnt,a[i].z);
60 }
61 int main(){
62 //  freopen("1.in","r",stdin);
63 //  freopen("1.out","w",stdout);
64     n=read(); t=read();
65     for (i=1;i<=n;i++) {
66            a[i].x=read();a[i].y=read();a[i].z=read();}
67     sort(a+1,a+n+1,cmp1);
68     for (i=1;i<=n;) {
69         k=i+1;
70         while (a[i].x==a[k].x&&a[i].y==a[k].y&&a[i].z==a[k].z&&k<=n) k++;
71         num++;
72         a[num]=a[i];
73         a[num].cnt=k-i;
74         i=k;
75     }
76     cdq(1,num);
77     for (i=1;i<=num;i++) {
78         f[a[i].ans+a[i].cnt-1]+=a[i].cnt;
79     }
80     for (i=0;i<=n-1;i++)
81       printf("%d
",f[i]);
82 }
原文地址:https://www.cnblogs.com/aininot260/p/9643701.html