zoukankan      html  css  js  c++  java
  • poj 2352 stars(树状数组)

    题目链接:http://poj.org/problem?id=2352

    题意:给出n个星星的坐标,每个星星的等级为纵坐标小于等于它且横坐标小于等于它的星星数,最后按顺序输出等级分别为0至n-1的的星星数。

    分析:这题属于树状数组的基础题。

    根据观察题目中给出的输入数据的性质就可以发现,在每颗星星的坐标被输入时,
    它的等级已经确定(所有满足条件的星星都已经在它之前给出)。
    而且它保证了之前的每一颗星星都满足纵坐标的条件,
    所以我们只需要统计当前横坐标小于等于Xi的星星个数就可以计算出Stari的等级了,
    所以通过使用一个树状数组统计每个横坐标位置上有多少颗星星即可了。
    需要注意的是为了使树状数组的下标从一开始,我们在读入之后应该将横坐标+1之后在进行统计。
    AC代码如下:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define N 32010
     4 int d[32010],cnt[15010];
     5 int lowbit(int x)
     6 {
     7     return x&(-x);
     8 }
     9 int GetSum(int x)
    10 {
    11     int s=0;
    12     while(x>0)
    13     {
    14         s+=d[x];
    15         x-=lowbit(x);
    16     }
    17     return s;
    18 }
    19 void update(int x,int num)
    20 {
    21     while(x<N)
    22     {
    23         d[x]+=num;
    24         x+=lowbit(x);
    25     }
    26 }
    27 int main()
    28 {
    29     int n,i,x,y;
    30     scanf("%d",&n);
    31     memset(d,0,sizeof(d));
    32     memset(cnt,0,sizeof(cnt));
    33     for(i=0;i<n;i++)
    34     {
    35         scanf("%d%d",&x,&y);
    36         cnt[GetSum(x+1)]++;
    37         update(x+1,1);
    38     }
    39     for(i=0;i<n;i++)
    40         printf("%d
    ",cnt[i]);
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    poj 3304 直线与线段相交
    poj 2318 叉积+二分
    AC自动机
    MySQL报错:Packets larger than max_allowed_packet are not allowed 的解决方案
    SCOPE_IDENTITY的作用
    Truncate table、Delete与Drop table的区别
    .Net Attribute特性
    vs2010 调试快捷键
    TFS和VSS的简单对比
    做网站用UTF-8还是GB2312 & 各国语言对应字符集
  • 原文地址:https://www.cnblogs.com/frog112111/p/3259198.html
Copyright © 2011-2022 走看看