JAVA线段树模板

public class LineTree{
    int[] tree,nums;
    int n;
    public LineTree(int[] nums){
        this.nums = nums;
        n = nums.length;
        tree = new int[n*4];
        build(0, 0, n-1);
    }

    // 建立线段树
    private void build(int node, int left, int right){
        if(left == right){
            tree[node] = nums[left];
        }
        int mid = left + ((left + right)>> 1);
        build(2*node + 1, left, mid);
        build(2*node + 2, mid + 1, right);
        tree[node] = tree[2*node + 1] + tree[2*node + 2];
    }

    // 更新线段树
    public void update(int node, int left, int right, int idx, int val){
        if(left > right) return;
        else if(left == right){
            nums[left] = val;
            tree[node] = val;
        }else{
            int mid = left + ((left + right)>> 1);
            if(idx >= left && idx <= mid)
                update(node * 2 + 1, left, mid, idx, val);
            else
                update(node * 2 + 2, mid + 1, right, idx, val);
            tree[node] = tree[node*2 + 1] + tree[node*2 + 2];
        }
    }

    // 查询线段树
    public int query(int node, int left, int right, int L, int R){
        if(right < L || left > R) return 0;
        else if(left == right) return tree[node];
        else if(L<= left && R >= right)return tree[node];
        else{
            int mid = left + ((right - left) >> 1);
            return query(node*2+1, left, mid,L,R) + query(node*2+2, mid+1, right, L, R);
        }
    }
}
posted @   like_a_star  阅读(186)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示