zoukankan      html  css  js  c++  java
  • poj 2481 树状数组

     题目大意:给你很多线段的头S和尾E,问每一条线段中包含了多少个线段,(S和E相同不计在内)

    变成坐标系上的点后求每个点左上角的点的个数

    按y从大到小插入结点


    3
    1 2
    0 3
    3 4
    0

    1 0 0

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<map>
     8 using namespace std;
     9 #define MOD 1000000007
    10 const int INF=0x3f3f3f3f;
    11 const double eps=1e-5;
    12 #define cl(a) memset(a,0,sizeof(a))
    13 #define ts printf("*****
    ");
    14 int n,m,tt;
    15 const int MAXN=100005;
    16 int c[MAXN],val[MAXN];
    17 int lowbit(int x)
    18 {
    19     return x&(-x);
    20 }
    21 void add(int i,int val)
    22 {
    23     while(i<=n)
    24     {
    25         c[i]+=val;
    26         i+=lowbit(i);
    27     }
    28 }
    29 int sum(int i)
    30 {
    31     int s=0;
    32     while(i>0)
    33     {
    34         s+=c[i];
    35         i-=lowbit(i);
    36     }
    37     return s;
    38 }
    39 struct node
    40 {
    41     int x,y,id;
    42     void in(int i)
    43     {
    44         scanf("%d%d",&x,&y);
    45         x++,y++;
    46         id=i;
    47     }
    48 }a[MAXN];
    49 bool cmp(node a,node b)
    50 {
    51     if(a.y==b.y)    return a.x<b.x;
    52     return a.y>b.y;
    53 }
    54 int main()
    55 {
    56     int i,j;
    57     #ifndef ONLINE_JUDGE
    58     freopen("1.in","r",stdin);
    59     #endif
    60     while(scanf("%d",&n)!=EOF&&n!=0)
    61     {
    62         cl(val);
    63         cl(c);
    64         cl(a);
    65         for(i=0;i<n;i++)
    66         {
    67             a[i].in(i);
    68         }
    69         sort(a,a+n,cmp);
    70         val[a[0].id]=0;
    71         add(a[0].x,1);
    72         for(i=1;i<n;i++)
    73         {
    74             if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y)  val[a[i].id]=val[a[i-1].id];    //区间完全重合
    75             else
    76             {
    77                 val[a[i].id]=sum(a[i].x);
    78             }
    79             add(a[i].x,1);
    80         }
    81         int k=0;
    82         for(i=0;i<n;i++)
    83         {
    84             if(k++) printf(" ");
    85             printf("%d",val[i]);
    86         }
    87         printf("
    ");
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    利用js在Table中追加数据
    C#API配置跨域
    C#linq查询DataTable
    erlang格式化输出
    erlang 的源代码保护机制
    MP3格式音频文件结构解析
    使用异步 I/O 大大提高应用程序的性能
    虚拟机安装mac 关键是换引导
    C/C++规则整理
    字节对齐
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4442068.html
Copyright © 2011-2022 走看看