对于树状数组,接触蛮长时间了,对它了解深了一点。
对于一个节点,比如说它的二进制的表达式为: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