三维偏序 模板

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 ll read(){
 6     ll x=0,f=1;char c=getchar();
 7     while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
 8     while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
 9     return x*f;
10 }
11 
12 struct Node{
13     int a,b,c;
14     int ans,cnt;
15     bool operator < (const Node &ano) const{
16         if(a!=ano.a) return a<ano.a;
17         else if(b!=ano.b) return b<ano.b;
18         else return c<ano.c;
19     }
20     bool operator <=(const Node &ano) const{
21         if(a<=ano.a && b<=ano.b && c<=ano.c) return 1;
22     }
23     bool operator ==(const Node &ano) const{
24         return a==ano.a && b==ano.b && c==ano.c;
25     }
26 } a[100100],put[100100];
27 int n,k;
28 int ans[100100];
29 
30 #define lowbit(x) (x&-x)
31 struct Bit{
32     int a[200200];
33 
34     void add(int pos,int val){
35         //cout<<"add "<<pos<<' '<<val<<endl;
36         while(pos<=200000){
37             a[pos]+=val;
38             pos+=lowbit(pos);
39         }
40     }
41 
42     int ask(int pos,int ret=0){
43         //cout<<"ask "<<pos<<' ';
44         while(pos){
45             ret+=a[pos];
46             pos-=lowbit(pos);
47         }
48         //cout<<ret<<endl;
49         return ret;
50     }
51 } BIT;
52 
53 void solve(int l,int r){
54     //cout<<l<<' '<<r<<endl;
55     if(l>=r) return;
56     int md=(l+r)>>1;
57     solve(l,md),solve(md+1,r);
58     int pos=l,top=l;
59     for(int i=md+1;i<=r;i++){
60         while(a[i].b>=a[pos].b && pos<=md){BIT.add(a[pos].c,a[pos].cnt);put[top++]=a[pos++];}
61         a[i].ans+=BIT.ask(a[i].c);put[top++]=a[i];
62     }
63     for(int i=l;i<pos;i++)
64         BIT.add(a[i].c,-a[i].cnt);
65     while(pos<=md) put[top++]=a[pos++];
66     for(int i=l;i<=r;i++)
67         a[i]=put[i];
68 }
69 
70 int main(){
71 #ifdef LZT
72     freopen("in","r",stdin);
73 #endif
74     n=read(),k=read();
75     for(int i=1;i<=n;i++)
76         a[i].a=read(),a[i].b=read(),a[i].c=read(),a[i].cnt=1;
77     sort(a+1,a+n+1);
78     int cnt=1;
79     for(int i=2;i<=n;i++){
80         if(a[cnt]==a[i]) a[cnt].cnt++; else a[++cnt]=a[i];
81     }
82     //for(int i=1;i<=cnt;i++)
83     //    cout<<a[i].a<<' '<<a[i].b<<' '<<a[i].c<<' '<<a[i].cnt<<endl;
84     solve(1,cnt);
85     for(int i=1;i<=cnt;i++)
86         ans[a[i].ans+a[i].cnt-1]+=a[i].cnt;
87     for(int i=0;i<n;i++)
88         printf("%d\n",ans[i]);
89     return 0;
90 }

 

posted @ 2018-07-29 23:13  wawawa8  阅读(280)  评论(0编辑  收藏  举报