题解 | 【模板】线段树1

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

public class Main {

    static int N = 100001; // 定义树状数组的最大长度

    static long[] fenwickTree = new long[N]; // 用于存储树状数组的数据

    static long[] arr = new long[N]; // 原始数组,用于存储输入数据

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int n = in.nextInt(); // 读取数组的长度

        int q = in.nextInt(); // 读取查询的数量

        // 初始化数组并更新树状数组

        for (int i = 1; i <= n; i++) {

            arr[i] = in.nextLong(); // 读取原始数组中的值

            add(i, arr[i]); // 将值添加到树状数组中

        }

        StringBuilder s = new StringBuilder(); // 用于存储查询结果

        for (int i = 0; i < q; i++) {

            int x = in.nextInt(); // 读取操作类型

            if (x == 1) {

                int ai = in.nextInt(); // 读取要更新的索引

                long k = in.nextLong(); // 读取要增加的值

                long delta = k; // 计算变化量

                arr[ai] += delta; // 更新原始数组

                add(ai, delta); // 更新树状数组

            } else {

                int l = in.nextInt(); // 读取区间左端点

                int r = in.nextInt(); // 读取区间右端点

                s.append(sum(r) - sum(l -

                                      1)).append('\n'); // 计算区间和并添加到结果中

            }

        }

        System.out.print(s); // 输出所有查询结果

    }

    // 单点更新:将索引 i 处的值增加 delta

    public static void add(int i, long delta) {

        while (i < N) {

            fenwickTree[i] += delta; // 更新当前节点的值

            i += i & -i; // 移动到父节点

        }

    }

    // 前缀和查询:返回从 1 到 i 的累加和

    public static long sum(int i) {

        long res = 0;

        while (i > 0) {

            res += fenwickTree[i]; // 累加当前节点的值

            i -= i & -i; // 移动到子节点

        }

        return res; // 返回前缀和

    }

}

全部评论

相关推荐

01-15 22:54
武汉大学 Java
点赞 评论 收藏
分享
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务