这题分析一下就可以用树状数组去做,因为已经排过序了,所以我们每次读入的点,前面的点的纵坐标都是小于当前点的纵坐标的,所以我们只要统计,之前所有点x坐标小于当前点的x坐标的的星星数即可。
每次加入一个点,都用对应的x坐标进行加一更新,用来影响后面的点,而在同一个纵坐标的点,如果x坐标大于了后面的比他高,但是x坐标较小的点,实际上也不会影响。实际上很简单,稍微思考一下就出来了。
需要特别注意的是这题会TLE,因为x坐标给了0值,lowbit会一直返回0,i一直加0就会T掉。所以x坐标加1即可,不会有任何的影响。
#include <iostream>
#include <cstdio>
const int maxn=32005;
int level[maxn];
int bit[maxn];
int n;
int lowbit(int x)
{
return x&(-x);
}
void edit(int x,int y)
{
//if x=0 -> TLE
for (int i=x;i<=maxn;i+=lowbit(i)) {
bit[i]+=y;
}
}
int sum(int x)
{
int ans=0;
for (int i=x;i>0;i-=lowbit(i)) {
ans+=bit[i];
}
return ans;
}
int main()
{
int x,y;
scanf("%d",&n);
for (int i=0;i<n;i++) {
scanf("%d%d",&x,&y);
level[sum(x+1)]++;
edit(x+1,1);
// for (int i=1;i<=8;i++) {
// printf("%d ",bit[i]);
// }
// printf("
");
}
for (int i=0;i<n;i++) {
printf("%d
",level[i]);
}
return 0;
}
/*
5
1 1
5 1
7 1
3 3
0 5
*/