浅谈线段树 Segment Tree】的更多相关文章

众所周知,线段树是algo中很重要的一项! 一.简介 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩. 二.用途 单点 : 查询(query)修改(add,mul) 区间 : 查询(区间和),修改,最大值(max),最小值(min). 三. 实现方式…
更新了基础部分 更新了\(lazytag\)标记的讲解 线段树 Segment Tree 今天来讲一下经典的线段树. 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 简单的说,线段树是一种基于分治思想的数据结构,用来维护序列的区间特殊值,相对于树状数组,线段树可以做到更加通用,解决更多的区间问题. 性质 1.线段树的每一个节点都代表了一个区间 2.线段树是一棵二叉树,具有唯一的根节点,其中,根节点代表的是整个区间\([1,n]\) 3…
原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即…
本文章转自洛谷 原作者: _皎月半洒花 一.简介线段树 ps: _此处以询问区间和为例.实际上线段树可以处理很多符合结合律的操作.(比如说加法,a[1]+a[2]+a[3]+a[4]=(a[1]+a[2])+(a[3]+a[4])) 线段树之所以称为“树”,是因为其具有树的结构特性.线段树由于本身是专门用来处理区间问题的(包括RMQ.RSQ问题等. 图片来源于互联网. 对于每一个子节点而言,都表示整个序列中的一段子区间:对于每个叶子节点而言,都表示序列中的单个元素信息:子节点不断向自己的父亲节点…
题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时,不需要改变,return:\(se>x>mn\)时,\(sum=sum+(x-mn)*t\),打上区间\(\max\)标记: 当\(x\geq se>mn\)时,不会做,继续递归分别处理两个子区间,直到遇到前两种情况. 操作三同理,维护最大值.最大值个数.次大值. 复杂度\(O(m\log…
一.线段树的定义 线段树,又名区间树,是一种二叉搜索树. 那么问题来了,啥是二叉搜索树呢? 对于一棵二叉树,若满足: ①它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ②若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 ③它的左.右子树也分别为二叉搜索树 那么这就是一棵二叉搜索树. 扯完废话,再回到线段树这里.顾名思义,线段树就是由线段构成的树,它大概长成这样: 对于每一棵线段树上的节点,都有三个值:左区间.右区间以及权值.(当然,在某些情况下它只有左右区间,这个时候线段…
线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中.下图就为一个线段树: (PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行.) 1.线段树基本性质和操作 线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L. 线段树T(a,b)也可递归定义为: 若L>1 : [a, (a+b) div 2]为 T的左儿子: [(a+b) div 2,b]为T 的右儿子. 若L=1 : T为叶子节点. 线…
今天我们说说线段树. 我个人还是非常欣赏这种数据结构的.(逃)因为它足够优美,有递归结构,有左子树和右子树,还有二分的思想. emm这个文章打算自用,就不写那些基本的操作了... 1° 简单的懒标记(仅含加法) 当我们进行区间修改(比如同时加上一个数)时,我们现在也许暂时不用它,可以当需要用的时候再改.这个时候我们就需要做个标记,这个标记就是懒标记,$lazy$.如果在后续的指令中需要从p向下递归,我们这时候检查它是否有标记.若有,就按照标记更新两个子节点,同时为子节点增加标记,清除p的标记.…
一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, 6], [0, 7]}, M个点{2, 4, 7},判断每个点分别在几条线段出现过? 1.构建线段树 2.处理线段 三条线段分割之后 3.查询 对于每一个值我们就可以开始遍历这一颗线段树,加上对于结点的count字段便是在线段中出现的次数 比如对于4,首先遍历[0, 7],次数 = 0+1=1:4在…
浅谈Trie树(字典树)         Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过. 答:简单!map,短小精悍. 好.下一个 2.给出n个单词和m个询问,每次询问一个前缀,回答询问是多少个单词的前缀. 答:map,把每个单词拆开. judge:n<=200000,TLE! 这就需要一种高级数据结构——Trie树(字典树) 二.原理 在本…