随笔分类 -  数据结构 - 线段树

摘要:题目大意:初始给定 N 个点,支持三种操作:两点之间连边;一个点与一个连续区间编号的点之间连边;一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路。 题解:学会了线段树优化建图。 发现若暴力进行连边,时间和空间都会被卡到 $O(n^2)$,直接起飞。 发现连边的点的编号是连续的,结合 阅读全文
posted @ 2019-09-16 18:32 shellpicker 阅读(174) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的字符串,定义一个字串是“好的”,当且仅当字串中含有一个 “2017” 的子序列,且不含有 “2016” 的子序列。现给出 M 个询问,每次询问区间 [l, r] 内至少删去多少个字符才能使得该区间变成“好的”。 题解: 由于题目中要求的是子序列,且序列长度仅为 4,考 阅读全文
posted @ 2019-09-10 20:33 shellpicker 阅读(234) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,定义连续区间 [l, r] 为:序列的一段子区间,满足 [l, r] 中的元素从小到大排序后,任意相邻两项的差值不超过1。求一共有多少个连续区间。 题解:单调栈 + 线段树 首先,对于区间计数类问题常规的思路是枚举区间的左端点或右端点,统计以该点为端点的区间个数 阅读全文
posted @ 2019-09-03 15:47 shellpicker 阅读(442) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N 个数字的排列,需要支持两种操作:对某个位置的数字 + 1e7,查询区间 [1, r] 中最小的不等于区间中任何一个数字的数。 题解:本题证明了对于 50W 的数据来说,$O(nlog^2n)$ 的算法是过不去的。。 首先,最暴力的做法就是树状数组套权值线段树,实现了支持单点修 阅读全文
posted @ 2019-08-28 16:39 shellpicker 阅读(211) 评论(0) 推荐(0)
摘要:题目大意:NOIP2018d1t1 支持 M 次区间查询答案和区间修改操作。 题解: 首先考虑不带区间修改的情况。从左到右进行考虑,发现对于第 i 个数来说,对答案的贡献仅仅取决于第 i 1 个数的大小:若 $a_i \le a_{i 1}$,则第 i 个数对答案的贡献为 0,否则对答案的贡献为两者 阅读全文
posted @ 2019-07-20 11:48 shellpicker 阅读(521) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a using namespace std; const int maxn=2e5+10; int n,m,ans[maxn 1]; int d[maxn],tot; struct 阅读全文
posted @ 2019-06-24 10:18 shellpicker 阅读(340) 评论(1) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,以及 M 个区间,现从中选出 K 个区间,使得这些区间的交集区间的点权和最大,求最大值是多少。 题解: 发现直接选 K 个区间不可做,考虑从答案入手。设答案区间为 [l,r],进行枚举答案区间的左端点。当前枚举到的左端点设为 L,那么能够以 L 作为左端点的区间 阅读全文
posted @ 2019-06-23 20:11 shellpicker 阅读(259) 评论(0) 推荐(0)
摘要:题目大意:给定 M 个城市,每年会选出一个城市举办比赛,现给出前 N 年城市举办比赛的情况。在接下来的年份中,每年会在举办比赛次数最小的城市举办比赛,如果有很多城市举办次数均为最小值,则在编号最小的城市举办比赛。现给出 Q 个询问,每次询问第 K 年在哪个城市举办比赛。 题解: 首先,记录下每个城市 阅读全文
posted @ 2019-06-17 14:36 shellpicker 阅读(544) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,每个点有两种状态 1/0,表示占有和空闲,现支持 first fit 查询是否有一段连续的长度为 X 的空闲子序列和区间赋值操作。 题解:get到了线段树新技能。。qwq 区间赋值操作和其他线段树一样,维护标记即可。 查询是否有一段连续的长度为 X 的空闲子序列 阅读全文
posted @ 2019-05-30 21:15 shellpicker 阅读(235) 评论(0) 推荐(0)
摘要:题目大意:维护一个长度为 N 的序列,支持单点修改,区间查询最长连续上升子序列的长度。 题解: 线段树维护一段区间左端点开始的 LCIS 长度,右端点开始的 LCIS 长度以及区间最优解。考虑进行合并,合并后区间的最优解可能由三部分构成,即:左区间的最优解、右区间的最优解和左区间rmx+右区间lmx 阅读全文
posted @ 2019-05-30 18:00 shellpicker 阅读(261) 评论(0) 推荐(0)
摘要:题目大意:维护一个长度为 N 的序列,支持单点删除,区间求最值。 题解:实际需要维护的操作是指定下标查询,区间下标求最值。 采用线段树维护区间的长度,若某个点被删除,则其长度减一。找到指定下标可以采用在线段树上二分序列长度,对于区间最值查询也是如此。 代码如下 cpp include define 阅读全文
posted @ 2019-04-30 00:13 shellpicker 阅读(312) 评论(2) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,M 个操作,支持区间加,区间查询最大公约数。 题解: 先来看一个子问题,若是单点修改,区间最大公约数,则可以发现,每次修改最多改变 $O(logn)$ 个答案,且 gcd 可以合并,因此可以直接在线段树上维护。 但是对于区间加来说,无法在已知区间加了某一个数时快 阅读全文
posted @ 2019-04-23 18:00 shellpicker 阅读(534) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,支持两种询问,即:区间异或,区间求和。 题解:加深了对线段树的理解。 对于线段树维护的变量一定是易于 modify 的,对于查询的答案只需用维护的东西进行组合而成即可。 异或和加法不具有分配律,因此不能直接维护区间和。考虑开 32 棵线段树,第 i 棵线段树维护 阅读全文
posted @ 2019-04-10 14:36 shellpicker 阅读(270) 评论(0) 推荐(0)
摘要:题目大意:维护一个序列,支持区间染色,查询区间中等于某个颜色的点的个数。 题解:考虑直接用线段树进行维护,维护区间相同颜色值和一个区间颜色是否相同的标记即可。 代码如下 cpp include using namespace std; const int maxn=1e5+10; int n,m,a 阅读全文
posted @ 2019-03-28 09:35 shellpicker 阅读(116) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,支持区间开根,区间求和。 题解:对于区间开根操作,可以发现任何一个位置的值开根至多 6 次就会变成 1。因此即使是整个区间开根,暴力修改6次后,所有的点的权值均小于等于1,即 $O(6n)$ 时间之后,再修改对序列的值已经不会产生影响,因此忽略后面的开根操作即可 阅读全文
posted @ 2019-03-25 08:54 shellpicker 阅读(199) 评论(0) 推荐(0)
摘要:题目大意:在线维护一个序列,支持插入一个数,查询区间最值。 题解:直接建立线段树,插入就单点修改,查询就正常查。。orz开始还真没想到。。 代码如下 阅读全文
posted @ 2019-03-19 17:15 shellpicker 阅读(144) 评论(0) 推荐(0)
摘要:题目大意:维护一个序列,支持区间加、区间染色、区间最值查询、区间和查询。 题解:对于区间赋值操作来说,维护一个赋值标记,注意,这里不能直接用赋值的值直接维护,因为不像加法标记,0 表示不用处理,这里 0 会表示成将区间赋值为 0,在这里卡了一小会QAQ。另外,关于多标记线段树下传的规则,可以考虑两种 阅读全文
posted @ 2019-03-19 12:52 shellpicker 阅读(157) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个矩形,求这些矩形的面积并。 题解:采用扫描线算法。 首先,按照矩形的横坐标排序,在纵坐标方向上维护一根扫描线被覆盖的长度,在这里采用线段树维护。统计答案时,从左到右扫描 2N 个 X 坐标,两个坐标之间的扫描线被覆盖的长度相等,因此直接长乘宽计入答案即可。 注意事项 由于坐标不 阅读全文
posted @ 2019-02-27 20:35 shellpicker 阅读(201) 评论(0) 推荐(0)
摘要:题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线。 题解:初步学习了李超线段树。李超线段树的核心思想在于通过 标记永久化 的方式来维护斜率。 代码如下 阅读全文
posted @ 2019-02-26 00:49 shellpicker 阅读(233) 评论(0) 推荐(0)
摘要:题目大意:维护一个集合,支持单点修改、查询小于 X 的数的个数、查询小于 X 的数的和。 题解:学习到了动态开点线段树。对于一棵未经离散化的权值线段树来说,对于静态开点来说,过大的值域会导致不能承受的空间。还可以发现,对于每次修改操作只会涉及一条树链,即:$O(logn)$ 个节点,因此总共所需的空 阅读全文
posted @ 2019-02-25 21:26 shellpicker 阅读(190) 评论(0) 推荐(0)