首页 > 其他分享 >【分治】线段树 SegmentTree

【分治】线段树 SegmentTree

时间:2024-10-13 13:21:27浏览次数:6  
标签:线段 分治 mid 节点 区间 sum SegmentTree ll

算法描述

线段树是一种能够处理区间修改和区间查询的数据结构。

顾名思义,线段树就是一种存储着线段数据的树形结构。它的每个节点都表示一个线段区间,每个节点的孩子节点存储的就是该区间的左半段和右半段。每个线段区间都存储着一个值,一般是区间和,也有可能是区间最大/最小值。

算法实现

线段树使用数组实现,根节点编号为 \(1\) 表示区间 \(1\) 到 \(n\),左子节点是 \(i \times 2\),右子节点是 \(i \times 2 + 1\).

ll lc(ll p){return p << 1;}
ll rc(ll p){return p << 1 | 1;}

初始化

从根节点开始,不断的分割区间直到该区间只剩单个数,然后开始向上汇总。传入两个变量 lr, 表示当前节点表示的线段。

void pushUp(ll p){
	sum[p] = sum[lc(p)] + sum[rc(p)];
}

void build(ll p, ll l, ll r){
	if(l == r){
		sum[p] = a[l];
		return;
	}
	ll mid = (l + r) >> 1;
	build(lc(p), l, mid);
	build(rc(p), mid + 1, r);
	pushUp(p); 
}

区间查询

区间修改

如果每次修改都从上到下全改一遍,复杂度得 \(\mathcal{O}(n)\) ,太浪费时间了。

标签:线段,分治,mid,节点,区间,sum,SegmentTree,ll
From: https://www.cnblogs.com/Allen-yang2010/p/18462192

相关文章

  • 线段树(超详解)
    线段树(超详解)Author:铜陵一中缪语博在网上看了几个讲线段树的,都感觉不咋地,自己琢磨了几天,大致弄明白了。于是趁兴写了一篇关于线段树的文章,希望拯救那些看oi−......
  • 线段树分治略解&杂题解析
    可能做到好题之后会再更新吧。总叙线段树与离线询问结合技巧又被称为线段树分治。使用线段树分治维护的信息通常会在某一个时间段内出现,要求在离线的前提下回答某一个时刻的信息并,则可以考虑使用线段树分治的技巧。以下是线段树分治的基本模板:change将信息按时间段覆盖在线......
  • 浅谈李超线段树
    众所周知,\(Li\Chao\Tree=LCT=Link\Cut\Tree\)。在我们的日常学习生活中,经常会遇到以下问题:维护一种数据结构,要求:添加一条线段求解\(x=k\)与所有线段交点中,\(y\)最大的一个。众所周知,线段会影响一个区间的答案。区间取\(max+\)单点最大值,想到线段树。但是该怎......
  • 浅谈一类动态开点线段树优化 - DEST树
    前言线段树,是一种优秀的数据结构,其应用极为广泛。其中,动态开点值域线段树,配合上线段树合并,甚至能替代或超越平衡树。但是,这种线段树的树高与值域相关,很容易产生四五倍常数。无论考虑时间或空间复杂度,这样的树都不算优。那么,我们是否能想办法优化它呢?优化思想正如上文所述,普通线......
  • 可持久化线段树
    可持久化线段树P3919【模板】可持久化线段树1(可持久化数组)维护一个长度为\(N\)的数组,支持如下几种操作在某个历史版本上修改某一个位置上的值访问某个历史版本上的某一位置的值此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新......
  • 树分治
    点分树关于模拟赛\(T2\)考点分树这件事。点分治点分树被称为动态点分治,所以下面先介绍点分治。P3806【模板】点分治1点分治板子。考虑一个树上的路径,如果已知所有\(dis,\)可以按是否经过根划分为:经过根:\(dis[u]+dis[v],\)这个方便用桶处理。没有经过根:经过了根的子......
  • 点分治
    感觉非常有深度,感觉过几天就又要忘了,所以我写个题解。P3806【模板】点分治1给定一棵有\(n\)个点的树,询问树上距离为\(k\)的点对是否存在。题意非常简单题意越短越毒瘤。大佬原文我们先想想点对有几种情况:第一种是经过根节点的路径;第二种是不经过根节点的路径;想第一......
  • 李超线段树
    1问题李超线段树是线段树的一种变种,主要用于维护二维平面上的直线信息以及查询操作。它的应用范围很广,只要式子的形式能转化为一次函数就可以考虑使用李超线段树进行求解/优化。具体的,李超线段树支持下面两种操作:动态在平面中插入一条线段/直线。在平面上询问与一条直线......
  • 分治法
    算法导论这个文档是学习“算法设计与分析”课程时做的笔记,文档中包含的内容包括课堂上的一些比较重要的知识、例题以及课后作业的题解。主要的参考资料是Introductiontoalgorithms-3rd(ThomasH.)(对应的中文版《算法导论第三版》),除了这本书,还有的参考资料就是Algorithmsdesi......
  • 【模板】"动态DP"&动态树分治
    目录题目描述朴素算法矩阵刻画实现code以洛谷模板题为例介绍动态dp的一般方法。P4719【模板】"动态DP"&动态树分治-洛谷|计算机科学教育新生态(luogu.com.cn)P4751【模板】"动态DP"&动态树分治(加强版)-洛谷|计算机科学教育新生态(luogu.com.cn)题目描述给定一......