AcWing 1265. 数星星 (树状数组)

Problem

树状数组新手表示看不出这是一道树状数组的应用题。
这个题需要累计左下角的星星数量,枚举会超时;纵坐标按照升序给出,对于新来的xy,y是当前纵坐标最大值,只需累计1到x的星星即可,然后树状数组优化。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(System.out);
    static int n;
    static int a[], c[], level[];

    public static void main(String[] args) throws IOException {

        n = Integer.parseInt(br.readLine());
        a = new int[n + 1];
        c = new int[32010];
        level = new int[n + 1];
        for (int i = 0; i < n; i++) {
            String s[] = br.readLine().split(" ");
            int x = Integer.parseInt(s[0]) + 1;
            level[query(x)]++;
            add(x, 1);
        }

        for (int i = 0; i < n; i++) pw.println(level[i]);

        pw.flush();
        pw.close();
        br.close();
    }

    public static int lowbit(int x) {
        return x & -x;
    }

    public static void add(int u, int v) {
        for (int i = u; i <= 32009; i += lowbit(i)) c[i] += v; //范围0 <= x <= 32000
    }

    public static int query(int x) {
        int res = 0;
        for (int i = x; i > 0; i -= lowbit(i)) res += c[i];
        return res;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值