zkw线段树学习笔记(待更)

众所周知,线段树是一种极其好的数据结构,对于维护区间各种操作都有良好的性能,但是我们并不满足,因为普通线段树是通过递归实现的,所以就会有一些问题,例如常数大和栈空间占用大。
因此,我们就想能不能有一种非递归版的线段树,于是zkw天牛创造了一种名为zkw线段树的非递归版线段树,详见《统计的力量》

1、建树


我们可以先观察左边面这张图。这张图本来是一张堆式的树形图,这里把它转化成了二进制。从中,我们可以发现最底层的节点舍去最低位,也就是说向右移一位之后,就变成了他们的父节点。同理,第二层中的结点也可以通过相同的方式变成根节点。
因此,我们在构建这棵树时,就可以利用计算机的二进制建树,达到快速简单的目的。
(不知道大家有没有听说过一句话,写程序要保持短而简单——Keep it short and simple,KISS)。

void build(int n)
{
    for(bit=1;bit<=n+1;bit<<=1); //bit为所能到达的最深层层数
    for(int i=bit+1;i<=bit+n;i++)
        scanf("%d",&d[i]);
    for(int i=bit-1;i;i--)
        d[i]=max(d[i<<1],d[i<<1|1]);
        //i<<1|1 = (i<<1)+1 = 2*i+1
}

 

上一篇
下一篇