线段树学习笔记

线段树本质为二叉搜索树

 

 

每个节点以结构体方式储存  (结构体需开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;
} 

 

posted @ 2020-08-04 13:27  Wh1te  阅读(64)  评论(0编辑  收藏  举报