题意:输入一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 }