线段树学习笔记
线段树本质为二叉搜索树
每个节点以结构体方式储存 (结构体需开4倍空间大小)
包含
{
区间左端点 l;
区间右端点 r;
(需要维护的信息);
}
struct node
{
int l,r,val;
}tree[maxn];
基础思路为二分
在结构体储存中tree[i]中
子节点为 2*i 与 2*i+1
二叉树的建立
#define ls (k<<1)
#define rs (k<<1|1)
void build(int l,int r,int k) /*建树*/
{
tree[k].l = l;
tree[k].r = r;
if(l == r)
{
tree[k].val = a[l]; //a[i]为区间值
return;
}
int mid = (r+l) >> 1 ;
build(l,mid,ls);
build(mid+1,r,rs);
tree[k].val = max(tree[ls].val,tree[rs].val);
}
查询操作
int ask(int l ,int r ,int k ) /*区间查询*/ { if(l<=tree[k].l && r>=tree[k].r) { return tree[k].val; } int ans = 0; int mid = (tree[k].l + tree[k].r)>>1; if(l <= mid) { ans = max(ans,ask(l,r,k*2)); } if(r > mid) { ans = max(ans,ask(l,r,k*2+1)); } return ans; }