• 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 }
  • 相关阅读:
    openpyxl python操作Excel表格,
    ansible剧本
    ansible基础知识(二)
    ansible基础知识
    Flask-Migrate
    Python3-笔记-B-003-数据结构-元组tuple( )
    Python3-笔记-B-002-数据结构-字典dict{ }
    Python3-笔记-B-001-数据结构-列表list[ ]
    Python3-笔记-A-001-基本语法
    cordova 学习链接
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9451174.html
Copyright © 2020-2023  润新知