线段树入门

这篇博客介绍了线段树的基础知识,包括定义、建树过程、点修改和区间查询的操作。提供了两个线段树的应用实例,分别是POJ 3264的Balanced Lineup问题和HDU 1754的I Hate It问题,帮助读者深入理解线段树在区间查询和点修改场景中的应用。
摘要由CSDN通过智能技术生成

传送门1

传送门2

维基百科:线段树区间查询

(0)定义:

 

#define lson rt<<1
#define rson rt<<1|1
const int maxn=1e5+5;//元素总个数
int sum[maxn<<2];//Sum求和,开四倍空间
int a[maxn];//原数组下标[1,n]

(1)建树:

#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
void push_up(int rt)//push_up函数更新节点信息,这里是求和
{
    sum[rt]=sum[lson]+sum[rson];
}
void build(int l,int r,int rt) //[l,r]表示当前节点区间,rt表示当前节点的实际存储位置
{
    if(l==r){//若到达叶节点
        sum[rt]=a[l];//存储a数组的值,应该是a[l]
        return ;
    }
    int mid=(l+r)>>1;
    //左右递归
    build(l,mid,lson);
    build(mid+1,r,rson);
    //更新信息
    push_up(rt);
}

(2)点修改:

假设A[L]+=C

 

void update(int L,int C,int l,int r,int rt){//[l,r]表示当前区间,rt是当前节点编号//l,r表示当前节点区间,rt表示当前节点编号
    if(l==r){//到达叶节点,修改叶节点的值
        sum[rt]+=C;
        return;
    }
    int m=(l+r)>>1;
   //根据条件判断往左子树调用还是往右
    if(L <= m) update(L,C,l,m,lson);
    else       update(L,C,m+1,r,rson);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值