数状数组:
int lowbit(int x)
{
return x&(-x);
}
void add(int po,int val)
{
while (po<=MAX)
{
c[po]+=val;
po+=lowbit(po);
}
}
int getsum(int po)
{
int sum=0;
while (po>0)
{
sum+=c[po];
po-=lowbit(po);
}
return sum;
}
#include <iostream>
#include <stdio.h>#include <cstring>
#define MAX 40000 //MAX>2*最多星星数
using namespace std;
int n,c[MAX],ans[MAX];
int lowbit(int x)
{
return x&(-x);
}
void add(int po,int val)
{
while (po<=MAX)
{
c[po]+=val;
po+=lowbit(po);
}
}
int getsum(int po)
{
int sum=0;
while (po>0)
{
sum+=c[po];
po-=lowbit(po);
}
return sum;
}
int main()
{
freopen("in.txt","r",stdin);
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
ans[getsum(x+1)]++; //x坐标右移一位,数状数组从1开始,否则会超时
add(x+1,1);
}
for (int i=0;i<=n-1;i++) printf("%d\n",ans[i]);
return 0;
}
/*在坐标上有n个星星,如果某个星星坐标为(x, y), 它的左下位置为:(x0,y0),x0<=x 且y0<=y。
如果左下位置有a个星星,就表示这个星星属于level a
按照y递增,如果y相同则x递增的顺序给出n个星星,求出所有level水平的数量。
算法:
树状数组。因为Y坐标已经有序,所以统计当前star前面的星星中,x坐标比它小的个数,
注意x坐标要左移1。因为数据存在x=0的情况。*/