线段树
区间查询
询问某段区间的某些性质(极值,求和,etc)
区间更新
某些操作影响了某段区间(统一加一个值……)
三个问题
更新点,查询区间
更新区间,查询点
更新区间,查询区间
线段树——在O(log2N)的时间内完成每次操作 O(Qlog2N)
线段树的本质是一棵二叉树,线段树的每一个节点记录的是一段区间的信息。
对于任一非叶子节点,若该区间为[L,R],则左儿子为[L,(L+R)/2]右儿子为[(L+R)/2+1,R] 。最后分到左右儿子相同。
struct Tree
{
int left,right; //区间的端点
int max,sum; //视题目要求而定
};
我们用一个数组a记录节点,且根节点的下标为1,对于任一节点a[k],它的左儿子为a[2*k]它的右儿子为a[2*k+1]。
一维数组即实现了线段树节点的保存。