输入样例:
5
1 1
5 1
7 1
3 3
5 5
输出样例:
1
2
1
1
0
解题思路:
题中的输入按y递增(y相同时按x增)的顺序,所以输入的点纵坐标依次增大,只需要考虑横坐标的位置,设a[i]:表示横坐标为i的星星有多少个,则当某坐标(xi,yi)时,只需要统计从a[0] + a[1] + a[2] +……a[i]的值。即前缀和,因为随着y坐标的增加,不断会有值加到a[i]中,所以实际上是求的动态数组的前缀和,所以用树状数组。
Java代码:
import java.io.*;
public class Main {
static int []tree = new int[32005];//树状数组,只考虑横坐标
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int level[] = new int[n];//表示每个等级的数量
for(int i = 0; i < n; i++) {
String[] split = br.readLine().split(" ");
int x = Integer.parseInt(split[0]) + 1;//避开下标0
level[sum(x)]++;//先查询后添加(自身不包括内)
add(x);
}
StringBuilder ans = new StringBuilder();
for(int data : level)
ans.append(data + "\n");
System.out.print(ans);
}
public static int lowbit(int x) {
return x & -x;
}
public static void add(int x) {
for(int i = x; i < 32005; i += lowbit(i)) tree[i]++;
}
public static int sum(int x) {
int res = 0;
for(int i = x; i > 0; i -= lowbit(i)) res += tree[i];
return res;
}
}