平移

zkw线段树

一世执手 提交于 2020-01-29 21:09:16
zkw线段树是zkw大神搞的自底向上线段树,以常数小,代码短著称。然而zkw大神的原ppt中描述简单,想了好长时间才想粗来。 以下内容针对 区间最小值 ,使用更好理解的递归方式描述。 定义 zkw线段树定义如下: 1. 它是一棵 满二叉树 2. 他的叶节点是一个数 3. 每一个非叶节点是一个数,且这个数是它的两个孩子中的较小值 显然,zkw线段树和普通线段树类似。他的叶节点从左到右是一个数列A1..n,非叶节点存一些信息以便查询区间最小值。 由于它是一个满二叉树,可以用 堆式储存法 储存。特别的,由于叶节点的个数为2的正整数幂,对于数据规模n,叶子节点的实际个数为 2 lg n + 1 , 没有数据的节点用 ∞ 填充 。 性质 不难发现,一棵有tn个节点的满二叉树有tn-1个非叶子节点。所以在堆式结构中,第i个叶子节点的位置是 tree[tn-1+i] 。这是一个很重要的性质,zkw线段树的许多操作是建立在他的基础上的。 由1容易得出,对于树上(堆中)任意一个位置i,如果i是偶数,那么它是一个左孩子;否则是一个右孩子。 1 2 3 4 5 6 7 //显然,所有奇数都是右孩子,偶数都是左孩子 建立数据结构 直接用静态数组建立即可,i的左右孩子分别为 i*2,i*2+1 const int maxn = 100000; // 最多节点数 int tree[maxn*4]; //