PKU2352 Stars - 树状数组

题目描述:

按照y坐标升序,x坐标升序输入N个星星的坐标。若左下角有k个星星,定义星星的级别为k。输出级别为0~N-1的星星分别有多少。

分析:

输入顺序已排好序,那么只要依次统计星星i之前x坐标小于等于i.x的星星有多少,即是星星i的级别。

这样也就成了树状数组的模型。编码很简单,y坐标没用。

注意,x可能为0,处理时要将所有的x+1。(用树状数组的时候一定要注意这一点)还有就是x的范围不能事先确定,在Add的时候我直接加到了x取值范围的最大值。

  1. /*
  2. PKU2352 Stars
  3. */
  4. #include <stdio.h>
  5. #include <memory.h>
  6. #define clr(a) memset(a,0,sizeof(a))
  7. #define N 15005
  8. #define M 32005
  9. int n,m;
  10. int c[M];   //下标从1开始
  11. int level[N];
  12. void Add(int i,int t){
  13.     while(i<M){
  14.         c[i]+=t;
  15.         i+=-i&i;
  16.     }
  17. }
  18. int Sum(int i){
  19.     int s=0;
  20.     while(i>0){
  21.         s+=c[i];
  22.         i-=-i&i;
  23.     }
  24.     return s;
  25. }
  26. int main()
  27. {
  28.     while(scanf("%d",&n)!=EOF){
  29.         //init
  30.         int i,j,k;
  31.         clr(c); clr(level);
  32.         m=0;
  33.         //input
  34.         for(k=0;k<n;k++){
  35.             scanf("%d%*d",&i);
  36.             level[Sum(++i)]++;
  37.             Add(i,1);
  38.         }
  39.         //output
  40.         for(i=0;i<n;i++){
  41.             printf("%d/n",level[i]);
  42.         }
  43.     }
  44.     return 0;
  45. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值