您的位置:首页 > 其它

POJ 2352 Stars

2014-05-09 16:36 357 查看
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
;
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: