线段树

很长,但此模板基本上把线段树所有的功能都包括了,包括更新,查询区间等,并且提前就把和还有最大最小值都写上了,到时候只需要去掉某些部分,并且把下面的部分内容改一下就好:

给一道模板题自己看看吧:

猛戳这里

代码如下:

//线段树模板
struct node{
	int r,l,sum,MAX,MIN;
}a[1000<<2];//存树 
void pushup(int o)//更新数据 
{
	a[o].MAX=maxa([o*2].MAX,a[o*2+1].MAX);
	a[o].MIN=min(a[o*2].MIN,a[o*2+1].MIN);
	a[o].sum=a[o*2].sum+a[o*2+1].sum; 
} 
void build(int o,int l,int r)//递归建树   
{  
    a[o].l=l;  
    a[o].r=r;  
    if(l==r)  
    {  
        int t;  
        scanf("%d",&t);  
        a[o].Max=a[o].Min=a[o].sum=t;  
        return ;  
    }  
    int mid=(r+l)/2;  
    build(o*2,l,mid);  
    build(o*2+1,mid+1,r);  
    pushup(o);  
}  
void update(int o,int l,int r,int x,int y)  
{  
    if(l==r)  
    {  
        a[o].Max=a[o].Min=a[o].sum=y;  
        return ;  
    }  
    int mid=(r+l)/2;  
    if(x<=mid)//二分思想,判断左右区间   
    update(o*2,l,mid,x,y);  
    else   
    update(o*2+1,mid+1,r,x,y);  
    pushup(o);//更新当前各节点的值   
} 
int Qure(int o,int l,int r,int x,int y)//球x到y区间的和(当然也可以在这里面稍加改变,就可以转变成就最大和最小值)   
{  
    if(l==x&&r==y)  
    {  
        return a[o].sum;  
    }  
    int mid=(l+r)/2;  
    if(y<=mid)//表示要查找的区间在左半部分   
    return Qure(o*2,l,mid,x,y);  
    else if(x>mid)//表示要查找的区间在右半部分    
    return Qure(o*2+1,mid+1,r,x,y);  
    else//表示既有左又有右   
    return Qure(o*2,l,mid,x,mid)+Qure(o*2+1,mid+1,r,mid+1,y);  
}

注意的是,这是c++,所以里面的max min等函数都得有头文件algorithm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值