「数据结构」线段树
线段树($Segment\ Tree$)是一种基于分治思想的__二叉树__形数据结构,可以用于__区间__上的数据维护,它可以维护以下值
- $maxn\ minn$,区间上最大最小值
- $sum$,区间和
- $lmax$,每段上最大前缀和
- $rmax$,每段上最大后缀和
- $……$
和以下操作
- $Add\ x\ y\ k$,把区间$[x,y]$内元素值全加$k$
- $Query\ x\ y$,查询区间$[x,y]$内的某个值
由于线段树会维护一种数据,其他也很好写,所以本篇以__区间和__为例
区间和
在每次$Add$操作中,如果将相关区间的值全部更新,则会把时间复杂度提高到$O(n)$
所以我们可以采取一种__延迟标记__($lazy-tag$)的技巧,如果被标记,则说明本区间内的值被整体加上某个值了
详细方法见代码:
1 | struct SegmentTree { |
为了使代码简洁,还可以宏定义一些名称
1 |
$Luogu$模板题目
Luogu P3373 线段树2 (区间增加,区间乘数,区间查询和)
$SPOJ$的$GSS$系列
- SP1043 GSS1 - Can you answer these queries I
- SP1557 GSS2 - Can you answer these queries II
- SP1716 GSS3 - Can you answer these queries III
- SP2713 GSS4 - Can you answer these queries IV
- SP2916 GSS5 - Can you answer these queries V
- SP4487 GSS6 - Can you answer these queries VI
- SP6779 GSS7 - Can you answer these queries VII