【HDU 1541】 树状数组(入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541

题目大意: 开始输入一个n(表示有n颗星星)。接下来n行,每行输入一个x,y,代表星星的坐标,注意y是递增输入。求各阶段星星的等级(阶段分为0~n-1)有多少,星星等级数计算方法为本星星左下角的有的星星个数。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn=32050;
 8 int  bit[maxn];
 9 int  level[maxn];
10 int  n;
11 
12 int lowbit(int x)
13 {
14     return x&((x)xor(x-1)); //等价于x&(-x)
15 }
16 
17 void add(int x,int val)   //用树状数组对后面节点更新
18 {
19     while(x<maxn)
20     {
21         bit[x]+=val;
22         x+=lowbit(x);
23     }
24 }
25 
26 int sum(int x)
27 {
28     int rank=0;   //rank代表星星的等级,即它的左下角有的星星个数
29     while(x>0)
30     {
31         rank+=bit[x];
32         x-=lowbit(x);
33     }
34     return rank;
35 }
36 
37 int main()
38 {
39     int   x, y;
40     while(scanf("%d",&n)!=EOF)
41     {
42         memset(bit,0,sizeof(bit));
43         memset(level,0,sizeof(level));
44         for(int i=0; i<n; i++)
45         {
46             scanf("%d%d",&x,&y);
47             level[sum(++x)]++;  //此阶段等级加1
48             add(x,1);
49         }
50         for(int i=0; i<n; i++)
51             printf("%d\n",level[i]);
52     }
53     return 0;
54 }

 

原文地址:https://www.cnblogs.com/kane0526/p/2759493.html