大意是N个星星,规定每个星星的等级为在它左下方星星的数量(包括某个坐标相等),N范围是15000,输入按y坐标的升序给出,如果两个星星y坐标相等,按x坐标升序给出。
用树状数组,不用管y坐标(因为已经是升序,后边的星星不影响前边星星的等级),用sum(n)来统计x坐标为n以前的星星个数,但是千万注意树状数组需要数组以1为首项,由于坐标有0,所以每次需要给x坐标+1。另外,通过这个题,我发现++i果然比i++快。两者一个420ms,一个360ms。还是差不少的,以后尽量用++i了:D
Code:
1 #include<stdio.h>
2 #include<string.h>
3 #define M 32006 //坐标范围是32000
4 int c[M],ans[M/2]; //c为树状数组,ans[i]表示level为i的星星个数
5 int lowbit(int t){
6 return t&(t^(t-1));
7 }
8 int sum(int m){
9 int total=0;
10 while(m>0){
11 total+=c[m];
12 m-=lowbit(m);
13 }
14 return total;
15 }
16 void modify(int position){
17 while(position<=32002){
18 ++c[position];
19 position+=lowbit(position);
20 }
21 }
22 int main()
23 {
24 int x,y,i,j,n;
25 scanf("%d",&n);
26 j=n;
27 memset(c,0,sizeof(c));
28 memset(ans,0,sizeof(ans));
29 while(n--){
30 scanf("%d%d",&x,&y);
31 ++ans[sum(x+1)];
32 modify(x+1);
33 }
34 for(i=0;i<j;++i)
35 printf("%d\n",ans[i]);
36 }