地址:https://loj.ac/problem/10114
解析:由于坐标是按y递增排序,所以对于一个点来讲,只看之前x小于等于它的就可以了。那么对于输入的每个点,求之前x小于等于它的,就得用树状数组维护。树状数组c[i]表示x=i时,它之前x小于等于它的有几个点。个数就是级数,num[]来记录。x+1防止死循环。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=32001;
int num[maxn];
int c[maxn];
int lowbit(int i)
{
return i&(-i);
}
void update(int x)
{
for(int i=x;i<=maxn;i+=lowbit(i))
c[i]++;
}
int getsum(int x)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
}
int main()
{
int n;
cin>>n;
int x,y;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
x++;
num[getsum(x)]++;
update(x);
}
for(int i=0;i<n;i++)
cout<<num[i]<<endl;
}