最初的思路是二位前缀和,但是在1e4的数据范围下会TLE
考虑到数据输入的顺序,是由下到上,由左到右输入的,当前星星左下边的星星数,即为之前的不大于当前星星横坐标的数量之和,使用树状数组维护每个横坐标上的星星数量的前缀和即可
注意:树状数组的下标必须从1开始,所以处理所有星星的横坐标时平移一位
#include<iostream>
using namespace std;
const int N=32005;
int tr[N];
int level[N];
int n;
int lowbit(int x)
{
return x&-x;
}
void add(int x,int c)
{
for(int i=x;i<=N;i+=lowbit(i))
tr[i]+=c;
}
int query(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
res+=tr[i];
return res;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;cin>>x>>y;
x++;//注意树状数组下标必须从1开始
level[query(x)]++;
add(x,1);
}
for(int i=0;i<n;i++)
cout<<level[i]<<endl;
}