poj2352 stars 树状数组


找某颗星的左下角有几颗星。输出有多少颗星左下角拥有0颗星,有多少颗左下角拥有1颗星……一直到n-1 。
因为输入时是按y值是递增的,所以直接用x(x也是递增的)来构建树状数组,接下来其实就是统计x 前面有多少个比它少的数。
树状数组参考:http://zxj015.blog.163.com/blog/static/170613730201136105251115/

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int MAX = 32002;

int n,c[MAX],an[MAX];
int lowbit(int x){
    return x & (-x);
}
 
void add(int i, int w){
    int flag=i;
    while(i <= 32002){
        c[i] += w;
        i += lowbit(i);
    }
}
 
int sum(int i){
    int ans = 0,flag=i;
    while(i > 0){
        ans += c[i];
        i -= lowbit(i);
    }
    return ans;
}
 
int main()
{
    int i,j,num,x,y;

    while(scanf("%d",&n)!=EOF)
    {
      for(i=0;i<=32002;i++)
       {
           c[i]=0;
           an[i]=0;
       }
      for(i = 1; i <= n; i ++)
      {
                     scanf("%d%d",&x,&y);
                     x++; //注意不能为零
                     an[sum(x)]++;
                     add(x,1);
      }
     for(i=0;i<n;i++)
         printf("%d\n",an[i]);
   }
 
    return 0;
}

posted @ 2011-04-08 17:54  CoderZhuang  阅读(106)  评论(0编辑  收藏  举报