M.J的blog

algorithm,ACM-ICPC
随笔 - 39, 文章 - 11, 评论 - 20, 引用 - 0
数据加载中……

POJ 2352 Stars【树状数组】

大意是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 }

posted on 2010-05-02 13:48 M.J 阅读(556) 评论(0)  编辑 收藏 引用 所属分类: 树状数组


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理