数星星
每个星星按照纵坐标升序的方式给出,每个星星左下方(包括正左,和正下)有k个星星,就是k级,问每级有多少个星星。
思路 只用看每个星星当前有多少个星星就可,因为他后面的纵坐标肯定大于等于它。
用一个level数组记录每个等级下有多少个星星,sum函数返回的是它之前有多少星星。
#include<iostream>
using namespace std;
const int N=32010;
int w[N],tr[N],level[N]; int lowbit(int x)
{
return x&-x;
}
void add(int a)
{
for(int i=a;i<=N;i+=lowbit(i))
tr[i]++;
}
int sum(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
res+=tr[i];
return res;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
x++;
level[sum(x)]++;
add(x);
}
for(int i=0;i<=n-1;i++)
printf("%d\n",level[i]);
return 0;
}