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

浙公网安备 33010602011771号