大意是N個星星,規(guī)定每個星星的等級為在它左下方星星的數(shù)量(包括某個坐標相等),N范圍是15000,輸入按y坐標的升序給出,如果兩個星星y坐標相等,按x坐標升序給出。
用樹狀數(shù)組,不用管y坐標(因為已經(jīng)是升序,后邊的星星不影響前邊星星的等級),用sum(n)來統(tǒng)計x坐標為n以前的星星個數(shù),但是千萬注意樹狀數(shù)組需要數(shù)組以1為首項,由于坐標有0,所以每次需要給x坐標+1。另外,通過這個題,我發(fā)現(xiàn)++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為樹狀數(shù)組,ans[i]表示level為i的星星個數(shù)
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 }