题意:
数星星,每颗星的等级就是他的左下角的星星的个数,首先数组已经排好序,y递增,y相等时x递增,所以,等级的大小就等于输入顺序中 横坐标<=x 的数的大小,树状数组中a[x]表示横坐标为x的点的个数,c[x]表示横坐标小于等于x的点的个数,即level的值 那么每插入一个点a ,c就会跟着改变。
可是大家是不是看到所有树状数组的程序都没有a数组,那么a和c的关系又怎嘛确定呢。。实际上边输入边插入,根本用不到令开一个a数组,是不是有种被骗的赶脚。。。所有的树状数组的图最小面都标记着a数组。。。
AC代码:
//首先数组已经排好序,y递增,y相等时x递增,所以,等级的大小就等于输入顺序中 横坐标<=x
//的数的大小,树状数组a[x]表示横坐标为x的点的个数,c[x]表示横坐标小于等于x的点的个数,即level得值
//那么每插入一个点a ,c就会跟着改变。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 32005
int ans[N];
int c[N];
int lowbit(int x)
{
return x&-x;
}
void add(int x,int n,int p)
{
while(x<=n)
{
c[x]+=p;
x+=lowbit(x);
}
}
int getsum(int n)
{
int sum=0;
while(n>0)
{
sum+=c[n];
n-=lowbit(n);
}
return sum;
}
int main()
{
// freopen("q.in","r",stdin);
int n;
int i,j,x,y,level;
memset(ans,0,sizeof(ans));
memset(c,0,sizeof(c));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;
level=getsum(x);
ans[level]++;
add(x,N,1);//y坐标不确定,所以这里必须是N,而不是n
}
for(i=0;i<n;i++)cout<<ans[i]<<endl;
}