线段树与树状数组

线段树与树状数组

树状数组

模板

public class BinaryIndexedTree {

    int N = 10010;
    int[] tree = new int[N];

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

    int query(int x) {
        int sum = 0;
        for (int i = x; i >= 0; i -= lowbit(i)) sum += tree[i];
        return sum;
    }

    void update(int x, int v) {
        for (int i = x; i <= N; i += lowbit(i)) tree[i] += v;
    }

    int query(int l, int r) {
        return query(r + 1) - query(l);
    }

}

方法1:树状数组

方法2:线段树

方法3.线段树

方法1:树状数组

方法1:TreeMap

方法2:Segment Tree

方法3:珂朵莉树

方法1:线段树

动态开点,懒标记,链接

方法2:TreeMap

方法3:TreeSet

方法4:建树

方法1:暴力

方法2:TreeMap

有点差分的思想

方法3:动态开点+懒标记线段树

方法1:TreeMap

方法2:线段树

方法1:TreeMap合并区间

  • 图2解释了合并多个区间,也就是while的条件

方法2:TreeSet合并区间

思路来自风雨大佬

  • 另一种写法

一些代码

权值线段树

  • P1908逆序对

Reference

Last updated