P3810 【模板】三维偏序(陌上花开)

传送门(洛谷)

哇塞大佬好厉害

据说正解是一维排序,二维CDQ,三维树状数组的……

然而大佬硬是二维三维都用了CDQ……

而且莫名好写……太暴力了……

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using std::sort;
 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<21],*p1=buf,*p2=buf;
 8 inline int read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;int res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 char sr[1<<21],z[20];int C=-1,Z;
19 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
20 inline void print(int x){
21     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
22     while(z[++Z]=x%10+48,x/=10);
23     while(sr[++C]=z[Z],--Z);sr[++C]='
';
24 }
25 const int N=100005;
26 int n,k,ans[N],d[N];
27 struct node{
28     int x,y,z;
29     bool b;int *ans;
30     inline void get(){
31         x=read(),y=read(),z=read();
32     }
33     inline bool operator ==(const node &a)const
34     {return x==a.x&&y==a.y&&z==a.z;}
35 }a[N],b[N],c[N];
36 inline bool cmp(const node &a,const node &b){
37     return a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.z<b.z);
38 }
39 void merge2(int l,int r){
40     if(l==r) return;
41     int mid=(l+r)>>1;
42     merge2(l,mid),merge2(mid+1,r);
43     int i=l,j=l,k=mid+1,cnt=0;
44     while(j<=mid&&k<=r){
45         if(b[j].z<=b[k].z){
46             c[i]=b[j++],cnt+=c[i].b;
47         }
48         else{
49             c[i]=b[k++];
50             if(!c[i].b) *c[i].ans+=cnt;
51         }
52         ++i;
53     }
54     while(j<=mid)
55     c[i]=b[j++],++i;
56     while(k<=r){
57         c[i]=b[k++];
58         if(!c[i].b) *c[i].ans+=cnt;
59         ++i;
60     }
61     for(int i=l;i<=r;++i) b[i]=c[i];
62 }
63 void merge1(int l,int r){
64     if(l==r) return;
65     int mid=(l+r)>>1;
66     merge1(l,mid),merge1(mid+1,r);
67     int i=l,j=l,k=mid+1;
68     while(j<=mid&&k<=r){
69         if(a[j].y<=a[k].y){
70             b[i]=a[j++],b[i].b=1;
71         }
72         else{
73             b[i]=a[k++],b[i].b=0;
74         }
75         ++i;
76     }
77     while(j<=mid)
78     b[i]=a[j++],b[i].b=1,++i;
79     while(k<=r)
80     b[i]=a[k++],b[i].b=0,++i;
81     for(int i=l;i<=r;++i) a[i]=b[i];
82     merge2(l,r);
83 }
84 int main(){
85     //freopen("testdata.in","r",stdin);
86     n=read(),k=read();
87     for(int i=1;i<=n;++i)
88     a[i].get(),a[i].ans=&ans[i],ans[i]=0;
89     sort(a+1,a+n+1,cmp);
90     for(int i=n-1;i;--i)
91     if(a[i]==a[i+1]) *a[i].ans=*a[i+1].ans+1;
92     merge1(1,n);
93     for(int i=1;i<=n;++i) ++d[ans[i]];
94     for(int i=0;i<n;++i) print(d[i]);
95     Ot();
96     return 0;
97 }
原文地址:https://www.cnblogs.com/bztMinamoto/p/9451174.html