题意不太好理解,看了半天才看懂,大概意思为:每个星星都有一个等级,它的等级是它的左下那一部分星星个数,数据是按y为第一关键字进行排序,x为第二关键字进行排序。
由于是按y为第一关键字进行排序,前面的都在它的左面或下面,只需考虑在它前面有多少小于或等于x的,用树状数组做
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=40000+100;
int a[maxn];
int sum[maxn];
int n;
int low(int k)
{
return k&(-k);
}
void update(int i,int v)
{
while(i<40010)
{
a[i]+=v;
i+=low(i);
}
}
int Sum(int x)
{
int total=0;
while(x>0){
total+=a[x];
x-=x&(-x);
}
return total;
}
int main()
{
while(~scanf("%d",&n))
{
int x,y;
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
x++;
sum[Sum(x)]++;
update(x,1);
}
for(int i=0;i<n;i++)
printf("%d\n",sum[i]);
}
return 0;
}