线段树

简而言之:就是 层数是 log2(n) 的树,然后用来快速求其中的区间和

代码

public class SegmentTree {
    private int[] tree;
    private int n;

    public SegmentTree(int [] arr) {
        n = arr.length;
        tree = new int[4 * n];
        buildTree(arr, 0, n - 1, 0);
    }

    private void buildTree(int [] arr, int start, int end, int treeIndex) {
        if(start == end) {
            tree[treeIndex] = arr[start];
        } else {
            int mid = (start + end) / 2;
            buildTree(arr, start, mid, 2 * treeIndex + 1);
            buildTree(arr, mid + 1, end, 2 * treeIndex + 2);
            tree[treeIndex] = tree[2 * treeIndex + 1] + tree[2 * treeIndex + 2];
        }
    }

    public int query(int start, int end, int treeIndex, int left, int right) {
        if(right < start || end < left) {
            return 0;
        }
        if(left <= start && end <= right) {
            return tree[treeIndex];
        }
        int mid = (start + end) / 2;
        int p1 = query(start, mid, 2 * treeIndex + 1, left, right);
        int p2 = query(mid + 1, end, 2 * treeIndex + 2, left, right);
        return p1 + p2;
    }

    public int rangeSum(int start, int end) {
        return query(0, n-1, 0, start, end);
    }
}

对于 15 个长度的数组 每位为 0 -> 14
生成的线段树

[ 105, 28, 77, 6, 22, 38, 39, 1, 5, 9, 13, 17, 21, 25, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
105
28                             77
6, 22                          38, 39
1, 5, 9, 13                    17, 21, 25, 14
0, 1, 2, 3, 4, 5, 6, 7         8, 9, 10, 11, 12, 13, 0, 0

参考资料

https://oi-wiki.org/ds/seg/
https://www.bilibili.com/video/BV1ce411u7qP/?spm_id_from=333.337.search-card.all.click&vd_source=17f48e3aed7bd7f0ebcb9e8cf14a5247
https://www.bilibili.com/video/BV1yF411p7Bt/?spm_id_from=333.337.search-card.all.click&vd_source=17f48e3aed7bd7f0ebcb9e8cf14a5247

posted on   HDU李少帅  阅读(12)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2019-12-28 思辨: 讨论交流和独立思考谁更重要。

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示