POJ2352 Stars [树状数组模板]

题意:输入一n颗星星的x,y坐标,给定判断level的标准,即某颗星星左下边(不高于它,不超过他,相当于以他为基准的第三象限)星星的数目为level,

输出level从0到n的星星个数。

 1 //poj2352
 2 #include <iostream>
 3 #include <string>
 4 #include <cstring>
 5 #include <queue>
 6 #include <vector>
 7 #include <cstdio>
 8 using namespace std;
 9 const int maxn=32002;
10 int s[15005];
11 int c[maxn];
12 
13 int lowbit(int x)//求编号,也就是2的k次方的k
14 {
15     return x&(-x);
16 } 
17 int getsum(int x)//1到x之间点的个数 
18 {
19     int sum=0;
20     for(int i=x;i>=1;i-=lowbit(i))
21     {
22         sum+=c[i];
23     }
24     return sum;
25 }
26 void add(int x,int y)//在x加y的值,相关节点自动更新 
27 {
28     for(int i=x;i<=maxn;i+=lowbit(i))
29         c[i]+=y;
30 }
31 void rs_add(int l,int r,int x)//区间修改 
32 {
33     add(l,x);
34     add(r+1,-x);
35 }
36 int main()
37 {
38     int n;
39     while(scanf("%d",&n)!=EOF)
40     {
41         memset(c,0,sizeof(c));
42         memset(s,0,sizeof(s));
43         for(int i=1;i<=n;i++)
44         {
45             int x,y;
46             scanf("%d%d",&x,&y);
47             x++;//有x=0的情况,但c下标从1开始 
48             s[getsum(x)]++;//先查询,因为算出的总个数不包括自己,sum(x)表示以前的点x小于等于当前点的x值的个数 
49             add(x,1);
50         }
51         for(int i=0;i<n;i++)
52             printf("%d\n",s[i]);
53     }
54     
55     return 0;
56 }

 

posted @ 2019-07-11 20:46  付玬熙  阅读(124)  评论(0编辑  收藏  举报