POJ 2352 Stars

POJ 2352 Stars

思路:这题就是数星星等级,每个星星的等级是在一个直角坐标系定义的~~咋一看似乎需要用的二维数组,但是x,y范围太大,办不到~·不过题目也说了,给的数据是按顺序给的~先y递增,然后x递增~~~基本上y是没用的,所以我下面加了个@SuppressWarnings("unused")(to y)

所以只要对x进行统计即可~要注意x等于0的情况要单独拿出来讨论。a[i]表示输入等级为 i 的星星的数量~~~由于y是按递增顺序给出的,所以某个星星的等级等于所有x坐标小于等于它的星星~~~

这样树状数组需要记录的数据就明白了~~就是记录x轴坐标upDate(x,1)就是星星x轴坐标大小为x的个数+1~每读入一个x坐标,更新一次~~相当于单点更新,区间查询~不过这个查询是实时的,每读入一个星星坐标,那个星星的等级就能确定了,否者会被后面加入的星星影响。

AC代码:

import java.util.Scanner;

public class Main
{
	static int maxn=32000;
	static int c[]=new int[maxn|1];
	static Scanner scan=new Scanner(System.in);
	
	private static int lowbit(int x) {return x&(-x);}
	
	private static void upDate(int x)
	{
		for(int i=x;i<=maxn;i+=lowbit(i))
			c[i]++;
	}
	
	private static int sum(int x)
	{
		int sum=0;
		for(int i=x;i>0;i-=lowbit(i))
			sum+=c[i];
		return sum;
	}

	public static void main(String[] args)
	{
		int n=scan.nextInt();
		int a[]=new int[n];
		for(int i=1,count=0;i<=n;i++)
		{
			int x=scan.nextInt();
			@SuppressWarnings("unused")
			int y=scan.nextInt();
			if(x==0)
			{
				c[0]++;
				a[count++]++;
			}
			else
			{
				a[sum(x)+count]++;//sum(x)是前面的所有星星,但是不包括x坐标为零的星星,x坐标为零的星星用count统计
				upDate(x);
			}
		}
		for(int i:a)
			System.out.println(i);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值