#include<iostream>
using namespace std;
const int N=100010;
int a[N],tr[N];
int lowbit(int x)
{
return x&-x;
}
void add(int x)
{
for(int i=x;i<=N;i+=lowbit(i))tr[i]++;//值得注意的是,树状数组的更新一定要更新到N
}
int query(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
{
res+=tr[i];
}
return res;
}
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
int x,y;
cin>>x>>y;
x++;//x的最小值是0,而树状数组的最小下标为1,所以整体往后移一个。
add(x);
a[query(x)]++;
}
for(int i=1;i<=t;i++)
{
cout<<a[i]<<endl;
}
return 0;
}
这题的主要考查的是树状数组的应用,因为坐标是按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。
所以只要求当前给出的坐标中所有横坐标小于等于该坐标的个数,自然能够想到使用前缀和,因为y坐标
是递增的,当前y坐标一定是最大的,所以求当前x的前缀和即可。

京公网安备 11010502036488号