树状数组

树状数组

template<class T>
struct BIT {
    T t[N];
    int size;
    void resize(int s) { size = s; }
    T query(int x) {
        assert(x <= size);
        T s = 0;
        for (; x; x -= lowbit(x)) {
            s += t[x];
        }
        return s;
    }
    void add(int x, T s) {//a[x]+=s
        assert(x != 0);
        for (; x <= size; x += lowbit(x)) {
            t[x] += s;
        }
    }
};

应用

直接存点的:

利用差分存点的:

利用差分存点的:

c1存i;c2存i*a[i];

利用差分存点原理:

a1=d1a2=d1+d2a3=d1+d2+d3a1+a2++an=i=1n(x+1i)di=(x+1)i=1ndii=1nidia_1=d_1 \\ a_2=d_1+d_2\\ a_3=d_1+d_2+d_3\\ ……\\ a_{1}+a_{2}+…+a_{n}=\sum_{i=1}^{n}(x+1-i)d_{i}=(x+1)\sum_{i=1}^{n}d_{i}-\sum_{i=1}^{n}i*d_{i}

注意在add函数中,下标不能有零,否则加上lowbit会死循环

树状数组二分

查询最大的pos满足a[1]+a[2]+……+a[pos]<=s

高维树状数组

二维:

Last updated