思路:这题就是数星星等级,每个星星的等级是在一个直角坐标系定义的~~咋一看似乎需要用的二维数组,但是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);
}
}