题意
每个星星都有一个等级,横纵坐标都不超过他的星星数即为他的等级
思路
给定的y都是升序排列的,所以每次只需更新x即可。边更新边插入
#include<cstdio>
#include<cstring>
const int maxn=32768;
int c[maxn]; //存放星星
int val[maxn]; //存放等级
int n;
int lowbit(int x)
{
return x&(-x);
}
void update(int x)
{
while(x<maxn)
{
c[x]+=1;
x+=lowbit(x);
}
}
int sum(int x) //求星星的等级
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
while(~scanf("%d",&n))
{
int x,y;
memset(val,0,sizeof(val));
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
val[sum(++x)]++; //防止出现x=0的情况,否则会TLE
update(x);
}
for(int i=0;i<n;i++)
printf("%d\n",val[i]);
}
return 0;
}