zoukankan      html  css  js  c++  java
  • 分治法:三维偏序问题之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 }
  • 相关阅读:
    css实现京东顶部导航条
    css盒布局-省份选择盘的实现
    css字体的属性
    css行高
    CSS定位(position)
    CSS-clear属性的作用
    2.b统计字符串长度
    rectangle类。java
    mysql 版本问题之sql-mode 导致 sql 语句报错
    根据一个表中同一字段的不同值进行统计!!!
  • 原文地址:https://www.cnblogs.com/aininot260/p/9643701.html
Copyright © 2011-2022 走看看