题目描述
有N个星星,给出N个星星的坐标,但是坐标给出的顺序有一定的规律,按照y坐标从小到大给出,当y坐标相同的时候按照x坐标的大小顺序给出;之后输出处在各个等级的星星的个数,等级就是看y坐标和x坐标同时小于等于这个星星的个数之和。
解题思路
这道题的难点在于如何用树状数组来存各个坐标星星的等级。
题意已说明输入的的时候是按Y坐标从小到大排序的,然后可以用一个数组来根据横坐标的大小来记录这个点的星星的的等级。
首先每次读入一个星星的位置后,在它属于的等级的个数+1,然后要更新它之后的横坐标的等级。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn = 32002;
int level[maxn];
int a[maxn];
int lowbit(int x)
{
return x & (-x);
}
void add(int i, int j)
{
while(i <= maxn)
{
a[i] += j;
i += lowbit(i);
}
}
int sum(int i)
{
int s = 0;
while(i > 0)
{
s += a[i];
i -= lowbit(i);
}
return s;
}
int main()
{
int n;
while(cin >> n)
{
memset(a, 0, sizeof(a));
memset(level, 0, sizeof(level));
int x, y;
for(int i = 1; i <= n; ++ i)
{
scanf("%d%d", &x, &y);
x ++;
level[sum(x)] ++;
add(x, 1);
}
for(int i = 0; i < n; ++ i)
{
printf("%d\n", level[i]);
}
}
return 0;
}