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;
}