分析:“不会有星星重叠。星星按 坐标增序给出, 坐标相同的按 坐标增序给出”所以后边的点一定覆盖前边的点,只需把x代入数组数组即可。
ac代码:
#include<bits/stdc++.h>
using namespace std;
int c[40010],vis[40010];
int lowbit(int x)
{
return x&-x;
}
int query(int x)//c初始为0 如果横坐标前边有点 就加上
{
int ans=0;
for(;x>0;x-=lowbit(x))
ans+=c[x];
return ans;
}
void up(int x)//后边的覆盖该点的都更新 多了一个点,加1
{
for(int i=x;i<=32001;i+=lowbit(i))
c[i]++;
return;
}
int main()
{
int n,i,x,y;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
x++;//横坐标从0算起,树状数组从1算起的
vis[query(x)]++;
up(x);
}
for(i=0;i<=n-1;i++)
printf("%d\n",vis[i]);
return 0;
}