线段树

欢迎在评论区留言和订阅专栏!

线段树是一个和树状数组差不多的数据结构,下面我就来讲一讲。

1.简介

线段树树状数组都是在线算法(前面讲过),与树状数组功能一样,是一种可以快速区间操作的算法

线段树一共有4个步骤,分别是:建树、pushdown、指定点加值和查询,并且附有main函数。

2.代码

1.建树

int n,m,sum[100005],lazy[100005],a[100005];
//递归建树
void built(int node, int start, int end){
	if (start == end) sum[node] = a[start];
    else{
    	int mid = (start + end) / 2;
        //二分
        built(node*2+1, start, mid);
        built(node*2+2, mid+1, end);
        
        sum[node] = sum[node*2+1] + sum[node*2+2];
    }
}

2.pushdown

void pushdown(int node, int start, int end){
	if (lazy[node] != 0){
    	int mid = (start+end)/2;
        sum[node*2+1] += lazy[node] * (mid-start+1);
        sum[node*2+2] += lazynode] * (end-mid);
        lazy[node*2+1] += lazy[node];
        lazy[node*2+2] += lazy[node];
        lazy[node] = 0;
	}
}

3.指定点加值

void add(int node, i

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

c++算法大全 文章被收录于专栏

本专栏收集了c++大部分基础算法,附有简介和代码。

全部评论
用了挺多的二分呀!
2 回复 分享
发布于 08-28 17:54 北京
lazy数组是干啥的呀
点赞 回复 分享
发布于 09-02 11:33 北京
二分是用来查询左节点和右节点。左节点是2n+1, 右节点是2n+2。
点赞 回复 分享
发布于 08-28 19:11 北京

相关推荐

用微笑面对困难:你出于礼貌叫了人一声大姐,大姐很欣慰,她真把你当老弟
点赞 评论 收藏
分享
评论
5
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务