POJ Problem 2352 - Stars
题目类型:树状数组、标记
题意:
在一个平面中给出一些星星得坐标(输入时按 y y y 递增得顺序给出,如果 y y y 相等则按 x x x 递增给出),定义一个星星的等级为在它左下方星星的数量,即 y y y 小于等于它且 x x x 小于等于它的星星的数量。输出 0 ~ n − 1 0~n-1 0~n−1 每种等级星星的数量。
分析:
因为输入是按 y y y 递增的顺序输入的,所以对于当前输入,它的等级就是在它之前的输入中 x x x 比它小的星星的个数。所以这里可以用树状数组对之前输入的星星的 x x x 进行标记,然后对 0 ~ x 0~x 0~x 进行求和就是这个星星的等级。然后将这次输入的 x x x 也标记一下。
代码
static int[] C = new int[32010];
static int[] ans = new int[15010];
public static void solve() throws IOException {
int n = nextInt();
for (int i = 0; i < n; i++) {
int x = nextInt() + 1;
int y = nextInt();
ans[getSum(x)]++;
add(x, 1);
}
for (int i = 0; i < n; i++) pw.println(ans[i] + " ");
pw.println();
}
public static void add(int x, int v) {
while (x < 32010) {
C[x] += v;
x += lowbit(x);
}
}
public static int getSum(int x) {
int re = 0;
while (x > 0) {
re += C[x];
x -= lowbit(x);
}
return re;
}
public static int lowbit(int x) { return x & (-x); }