1265. 数星星 Java题解 (树状数组)

输入样例:

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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值