首页 > 其他分享 >解题报告-论对“线段树思想”的新理解

解题报告-论对“线段树思想”的新理解

时间:2025-01-15 21:22:18浏览次数:1  
标签:结点 递归 线段 更新 解题 论对 区间 树中

解题报告-论对“线段树思想”的新理解

一晚上刷了两个线段树知识点,也是见识到了线段树世界的博大精深。

我们发现无论怎么写线段树,大体框架都是一样的。那么为什么有那么多种线段树呢?

一个是线段树标记的不同。在李超线段树中,每个结点维护的是当前结点最上面那条线的编号,于是更新的时候不能只更新一个点,要更新整个区间,这就决定了其 addtag 方式的独特。而在吉司机线段树中,由于要维护很多信息,所以每个信息 pushuppushdown 的方式会有点不一样,这是一点。

第二个就是很重要的一点,线段树的分治思想。我们想想在最朴素的线段树中,当我们发现当前处理的区间 \([l,r]\) 不完全包含于更新或查询的区间 \([L,R]\) 的时候,我们就会把这个问题向左儿子和右儿子分治。这是最朴素的限制:区间范围的限制。

当然,在很多题中,一个区间范围的限制是远远不够的,我们甚至可能受到我们所维护的信息的限制。比如在吉司机线段树中,如果我们要对区间取 \(\min\) 结果发现要取 \(\min\) 的值小于区间次大值,我们肯定是无法待在当前结点就把区间问题处理了。那怎么办呢?

记住一个定律:当你推了很久的公式,发现无论如何加 \(\text{tag}\) 都无法维护当前结点的信息的时候,直接往左右儿子递归。当我们已经记录了足够多的信息,并且不能仅在当前结点就处理区间问题的时候,就相当于当前结点的条件不够,要往左右儿子递归。再不济,递归到底层结点也是可以解决问题的,而往往我们不用递归到底层。

吉司机线段树就是这样分治思想的一个典型范例,而李超线段树也是一样的。一个区间中要更新的一条线段加到这个区间的时候,原来这个区间里有一堆线段,除非这条线段在所有之前的线段之上,你并不能知道哪些该被更新哪些不该被更新,这个时候就要递归到左右子树中加 \(\text{tag}\)。这也就是李超线段树时间复杂度 \(O(n \log^2 n)\) 的原因:线段树本身是 \(O(n \log n)\) 的,但是加 \(\text{tag}\) 是运用了线段树的分治思想,所以多了一个 \(\log\)。

标签:结点,递归,线段,更新,解题,论对,区间,树中
From: https://www.cnblogs.com/KarmaticEnding/p/18673733

相关文章

  • 线段树学习笔记
    什么是线段树线段树是一种基于分治思想的二叉树结构,用于在区间上进行信息统计,比树状数组更为通用、直观,支持单点修改、区间修改、区间查询。线段树维护的数据具有可并性,比如区间和、区间积、区间最值等等。模板建树voidbuild(intl,intr,intp){ tre[p].l=l;tre[p].r=r;......
  • P3247 [HNOI2016] 最小公倍数 解题报告
    前置知识:可撤销并查集用一个栈记录合并顺序,每次撤销将栈顶的元素恢复但是这种方法不能路径压缩,因为会改变节点之间的关系,为了保证时间,可以按照\(size\)进行合并题意显然为能不能找到一条路径,使这条路径上最大的\(a\)为\(qa\),最大的\(b\)为\(qb\)因为有a和b两个限制,考......
  • 线段树【区间GCD】
    https://codeforces.com/contest/2050/problem/F#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#definelowbit(x)x&(-x)#defineendl'\n'usingll=longlong;usingpii=pair......
  • CF1956F Nene and the Passing Game 解题报告
    假设\(j>i\),则:\(i+l_i\lej-l_j,i+r_i\lej-r_j\)所以相当于看区间\([i+l_i,i+r_i]\)和区间\([j-r_j,j-l_j]\)是否有交集可以将这些区间放在数轴上,考虑建虚点,将数轴上的每个点向包含它的区间连边但是这样会有一个问题,记加为右区间,减为左区间,此时就无法判断是哪种区间在相......
  • 64.在Vue3中使用OpenLayers显示带箭头的线段,箭头居中
    在WebGIS开发中,使用OpenLayers渲染地图和矢量图形是常见的需求。今天我们来实现一个效果:在Vue3项目中,使用OpenLayers显示带箭头的线段,并让箭头居中。项目环境和技术栈Vue3+CompositionAPIOpenLayersVite构建工具实现效果我们将绘制一条由多个坐标点构成的线......
  • 线段树入门讲解
    有一段时间没有更新了,前面比较忙,所以知识上会有一些跳跃,后面看看有没有时间去补一下吧,没有就算了那现在就开始说一下线段树线段树是一种数据结构,他主要是用于实现快速的区间修改和区间求和这两个功能,同时,有别于树状数组,线段树还有更多的是在于其功能的强大和灵活性上,就比如说,树......
  • 线段树分治-学习笔记
    线段树分治-学习笔记阅前须知:本文给出了线段树分治的一道例题以及多道习题,同时给出了部分实现的代码,帮助学习线段树分治。总述线段树分治是一种离线算法,在于把修改挂在线段树的节点上,通过遍历线段树求出每个叶子节点的答案,以减小复杂度。例题P5787二分图题目大意:\(n\)个点......
  • 线段树+最大最小
    https://codeforces.com/contest/2057/problem/D#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#defineendl'\n'usingll=longlong;usingpii=pair<int,int>;constdoub......
  • 洛谷题单指南-线段树的进阶用法-P3157 [CQOI2011] 动态逆序对
    原题链接:https://www.luogu.com.cn/problem/P3157题意解读:长度为n的序列,序列是1~n的排列,一共m个删除操作,每一个删除之前输出逆序对。解题思路:要计算静态的逆序对,可以通过树状数组、权值线段树等方式,时间复杂度都是O(nlogn)要计算动态的逆序对,算上每一次删除,暴力做法需要O(mnlo......
  • P1803 凌乱的yyy / 线段覆盖
    P1803凌乱的yyy/线段覆盖题目现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个及以上的......