博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树基本格式
阅读量:6265 次
发布时间:2019-06-22

本文共 1998 字,大约阅读时间需要 6 分钟。

n线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b]。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。
 
 除去最后一排线段树是一个满二叉树,如图

 

定义:

静态全局数组模拟
struct Node{
    int left, right;
    …
}node[MAXN*4]
一般大小开成节点数的4倍,不需要担心空间问题
 
指针
Struct node{
    node * left;
    node * right;
    …
};
 

 
建树 Build
建树时从第一个区间开始,
1 void Build(int u,int l,int r) 2 { 3     if(l==r){            //叶子节点  4         ...             //一些赋值  5     } 6     int mid=(l+r)>>1; 7     Build(L(u),l,mid);        //左子树  8     Build(R(u),mid+1,r);     //右子数 9     pushup(u)                //一般这里有一个向上更新 10 }

 


向上更新 Pushup

 

该函数就是由子结点递归回来 修改父结点中的信息
void Pushup(int u){        node[u].sum = node[L(u)].sum + node[R(u)].sum;      …….       …….    return ;}

延时更新Pushdown

 

调用此函数时,结点中一般有个状态标志位 用来判断是否需要往下更新
覆盖一般是在查询或者更新的时候,全更新会超时
void Pushdown (int u)   //延迟覆盖操作{    if (node[u].state == -1)    {             ...	更新父结点,左右子结点信息       }    else if (node[u].state == 1)    {     ....       更新父结点,左右子结点信息    }     else     {	    ………    }}

 


更新操作 Update
 
void Update(int u,int left,int right,data val){    if (left<=node[u].l&&node[u].r <= right)    {        ……..               //进行某些更改操作        return ;    }     Pushdown(u);          // 成段更新时,这里一般都有个延时更新    int mid = (node[u].l + node[u].r)>>1;   //然后就是往左 往右 或左右找区间 几乎所有的    if (right <= mid) Update(L(u),left,right,val);             //线段树都这样    else if (left > mid) Update(R(u),left,right,val);    else {        Update(L(u),left,mid,val);        Update(R(u),mid+1,right,val);    }    Pushup(u);        //这里也一般有个向上更新}

  


查询操作 Query
Data Query(int u,int left,int right){    if (left <= node[u].l&&node[u].r <= right)        return node[u].sum;    Pushdown(u);    //同update操作 视情况可有可无    int mid = (node[u].l + node[u].r)>>1;    if (right <= mid) return Query(L(u),left,right);    else if (left > mid) return Query(R(u),left,right);    else return (Query(L(u),left,mid) + Query(R(u),mid+1,right));    Pushup(u);       //同上}

  


这个人的博客上有很多线段树的题,大家可以参考,我们就是从这上面选题来做的

 

n
 

转载于:https://www.cnblogs.com/lwhinlearning/p/5668344.html

你可能感兴趣的文章
数学之路(3)-机器学习(4)-专家系统(1)
查看>>
Android中常用单位dp,px,sp之间的相互转换
查看>>
C++线性方程求解
查看>>
nginx负载均衡的实现
查看>>
Oracle PL/SQL之LOOP循环控制语句
查看>>
Webkit内核的浏览器中用CSS3+jQuery实现iphone滑动解锁效果(译)
查看>>
Can't create handler inside thread that has not called Looper.prepare()
查看>>
MDaemon运行六年方法
查看>>
SQL SERVER 存储过程应用
查看>>
Locale ID (LCID) Chart 区域设置ID
查看>>
Microsoft Windows Scripting Self-Paced Learning Guide
查看>>
Windows Phone Background Agent杂谈
查看>>
AJAX POST&跨域 解决方案 - CORS(转载)
查看>>
Vim中的swp文件
查看>>
[iphone-objective C]去掉一段String中的HTML标签
查看>>
NSArray与NSMutableArray的区别
查看>>
Firefox 9正式发布
查看>>
ADO.NET简介
查看>>
[转]免费开源.net网上商城
查看>>
Android so减包相关
查看>>