ZKW线段树

应某迪要求,写一篇数据结构学习笔记。

实际上还没有学很多东西,只是一些基础的操作。

zkw线段树的学习资料,网上有很多,这里记录的只是自己的一些理解。

建树

1 inline void build(){
2     for(bit=1,n=read();bit<=n+1;bit<<=1);
3     for(int i=bit+1;i<=bit+n;++i) sum[i]=read();
4     for(int i=bit-1;i;--i) sum[i]=sum[i<<1]+sum[i<<1|1];
5 }

$zkw$线段树构造了一棵完美二叉树,只有最后一层叶子节点管辖的区间大小为1。

$zkw$线段树是基于位运算的,对于节点$p$,$p<<1$为它的左儿子,$p<<1|1$为它的右儿子。

因为是一棵完美二叉树,除掉叶子节点的部分一定为$2^k-1$的形式,将这个$2^k$记为$bit$,可以方便我们之后的操作。

其意义是,对于原序列的点$i$,可以直接得到对应线段树上的节点$i+bit$。

注意这里我们忽略了$bit$也就是$2^k$这一个节点,以后再提。

同时建树的一个细节是$bit$应当大于$n+1$,其原因也可以留到后面。

01-14 03:08
查看更多