树状数组

对于树状数组,接触蛮长时间了,对它了解深了一点。

对于一个节点,比如说它的二进制的表达式为:1001011101

那么如果我要询问1~1001011101这个区间,那么要寻问哪几个节点呢:

    1001011101,1001011100,1001011000,1001010000,1001000000,1000000000

    然后我们还可知道1001011101统计的区间为 1001011101→1001011100

现在我要去跟新1001011101这个节点,那么假设上限为 1<<10 , 那么需要跟新的节点是什么呢:

    1001011101,1001011110,1001100000,1010000000 , 1100000000 ,1<<10

    然后我们还可以知道1001011101的上级是1001011110

http://www.cnblogs.com/wuyiqi/archive/2011/12/25/2301071.html

spfa的板子:

const int N = 100000 + 5;

struct FenwickTree {
    int *C,n;
    FenwickTree(int size = 0) {
        n = size;
        C = pool + pool_size;
        std::fill(C,C+size,0);
        pool_size += size;
    }
    void modify(int p,int val) {
        for (int i = p; i < n; i += ~i&i+1) C[i] += val;
    }
    int query(int p) {
        int ret = 0;
        for (int i = p; i >= 0; i -= ~i&i+1) ret += C[i];
        return ret;
    }
    int Kth(int K) {
        int p = -1;
        for (int i = 18; i >= 0; -- i) {
            p += 1 << i;
            if (p >= n || C[p] >= K) p -= 1 << i;
            else K -= C[p];
        }
        return p + 1;
    }

    static int pool_size;
    static int pool[N];
};
int FenwickTree::pool_size;
int FenwickTree::pool[N];

 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5493

posted @ 2015-06-04 01:35  92度的苍蓝  阅读(212)  评论(0编辑  收藏  举报
http://images.cnblogs.com/cnblogs_com/Running-Time/724426/o_b74124f376fc157f352acc88.jpg