题意:给定若干个点(星星),每个点的评级标准是既不在它右边,也不在它上边的点的个数,求每个等级所含有的星星个数。
做法:因为输入时,坐标已经按y,x递增排序,所以可以更加x坐标统计某一时刻0-x坐标范围内所含有的点的个数。因为输入限制,可以确定的是,每次使用sum函数得到的值一定都是符合题意的。
#include<cstdio>
#include<iostream>
#include<cstring>
#define LMT 32005
#define lowbit(x) x&(-x)
using namespace std;
int num[LMT],n,lev[15005];
void init(void)
{
memset(num,0,sizeof(num));
memset(lev,0,sizeof(lev));
}
void update(int x,int ope)
{
while(x<LMT)
{
num[x]+=ope;
x+=lowbit(x);
}
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=num[x];
x-=lowbit(x);
}
return ret;
}
int main(void)
{
int x,y,tem;
while(~scanf("%d",&n))
{
init();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
x++;
tem=sum(x);
lev[tem]++;
update(x,1);
}
for(int i=0;i<n;i++)printf("%d\n",lev[i]);
}
return 0;
}