假设我们此时线段树维护的信息集合为 \(D\),标记集合为 \(T\),而对于一颗线段树,我们需要维护的操作无非就是:
- 区间合并:把两个相邻区间 \([l_1,r_1],[l_2,r_2]\) 的序列信息合并起来作为大区间 \([l_1,r_2]\) 的序列的信息。
- 懒标记下传:把当前区间的懒标记作用到它的两个子区间上,而这又分为两个过程,即当前区间懒标记对子区间懒标记的作用,以及当前区间懒标记对子区间序列信息的作用。即懒标记之间的复合和懒标记对序列信息的复合。
那么信息集合 \(D\) 和标记集合 \(T\) 就需要满足以下的条件:
- 存在运算 \(+:D \times D \to D\),其中 \(\times\) 是笛卡尔积,下面同理。
- 由于标记需要作用到信息上,所以合并完之后依然是信息,那么就存在运算 \(\text{apply}:T \times D \to D\)。
- 标记需要复合才能保证复杂度,所以标记复合之后依然为标记,所以存在运算 \(\cdot:T\times T \to T\)。
- 当节点上没有标记时,事实上存储了一个代表「什么都不做」的空标记,那么就要求 \((T,\cdot)\) 这个群存在单位元。
除了这些限制,我们可以通过模拟线段树的过程来观察到其他的性质:
- 我们在查询的时候一般会将区间 \([l,r]\) 的询问拆成 \([l,m]\) 和 \([m+1,r]\) 这两个区间然后再合并,其中 \(m = \lfloor \frac{r+l}{2} \rfloor\)。这就说明了 \(D\) 对 \(+\) 满足结合律,且合并完之后依然为信息。因此 \(D\) 需要是一个半群。
- 子区间序列信息复合懒标记以后再合并和子区间序列信息合并后再复合懒标记相等,即 \(t(d_1 + d_2) = t\cdot d_1 + t\cdot d_2\),那么 \(\cdot\) 对 \(+\) 有分配律。
而我们发现 \((D,+)\) 和 \((T,\cdot)\) 都满足幺半群的条件,即满足封闭性,结合律和有单位元这三个条件。而这样子的线段树也被称之为双半群线段树。