![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-线段树
文章平均质量分 66
_lifehappy_
这个作者很懒,什么都没留下…
展开
-
2021CCPC华为云挑战赛:HDU 7091 重叠的子串(SAM + 线段树合并)
重叠的子串给定一个长度为n(1≤∣s∣≤105)n(1 \le \mid s \mid \le 10 ^ 5)n(1≤∣s∣≤105)的只由小写字母构成的字符串sss,有m,(1≤m≤106)m, (1 \le m \le 10 ^ 6)m,(1≤m≤106)个询问:每次询问给定l,rl, rl,r,问sss是否存在一个字串ttt,满足∣t∣<2(r−l+1)\mid t \mid < 2(r - l + 1)∣t∣<2(r−l+1),且s[l,r]s[l, r]s[l,r]在ttt中原创 2021-08-21 18:52:27 · 405 阅读 · 0 评论 -
F. Strange Array(Codeforces Round #727 (Div. 2))(主席树)
F. Strange Array给定一个长度为nnn的数组aaa,1≤ai≤n1 \leq a_i \leq n1≤ai≤n,对于每个aia_iai,我们要找到一个l≤i,r≥il \leq i, r \geq il≤i,r≥i,使得,我们对区间[l,r][l, r][l,r]升序后,值为aia_iai的数与中位数相隔最远,输出这个最远距离。我们分两种情况讨论:aia_iai在中位数的左边,也就是ai≤a_i \leqai≤中位数,我们考虑把aj≥aia_j \geq a_iaj≥a原创 2021-06-21 14:30:44 · 335 阅读 · 0 评论 -
L - Lookup Performance(主席树)
L - Lookup Performance问对于一颗二叉搜索树来说,如果我们要找一个值域区间的值有多少个,他会向下递归查找几次,设,第iii个节点所代表的最大最小值为li,ril_i, r_ili,ri,此时我们要查询L,RL, RL,R之间的值有多少个,如果L≤li≤ri≤RL \leq l_i \leq r_i \leq RL≤li≤ri≤R,那么我们不会递归下去查询,意味着当访问完这个点后不会对答案产生新的贡献。如果ri<L or li>Rr_i &原创 2021-05-27 14:41:16 · 296 阅读 · 0 评论 -
CF1422F Boring Queries(ST表 + 主席树)
CF1422F Boring Queries给定一个长度为nnn的数组a,(1≤ai≤2×105)a,(1 \leq a_i \leq 2 \times 10 ^ 5)a,(1≤ai≤2×105),有mmm次询问,每次询问给定l,rl, rl,r,要我们求区间[l,r][l, r][l,r],aia_iai的lcmlcmlcm,强制在线。对于质因子ppp,如果p2>2×105p ^ 2 > 2 \times 10 ^ 5p2>2×105,那么它在每个数中出现的次数只有两种可能0/1原创 2021-05-25 16:03:07 · 269 阅读 · 0 评论 -
L. Continuous Intervals(单调栈 + 线段树 + 思维)
L. Continuous Intervals给定一个长度为nnn的数组,问里面有多少个区间[l,r][l, r][l,r],满足,对这个区间排序后,两两差值$ \leq 1$,输出区间个数。如果说区间[l,r][l, r][l,r]是符合要求的,则满足max(al,…,ar)−min(al,…,ar)+1=cntmax(a_l, \dots, a_r) - min(a_l, \dots, a_r) + 1 = cntmax(al,…,ar)−min(al,…,ar)+1=cnt,cntcntc原创 2021-05-19 20:43:54 · 306 阅读 · 0 评论 -
P2839 [国家集训队]middle(二分 套 主席树)
P2839 [国家集训队]middle有一个长度为nnn的序列,有mmm次询问,每次询问a,b,c,da, b, c, da,b,c,d,为l∈[a,b],r∈[c,d]l \in [a, b], r \in [c, d]l∈[a,b],r∈[c,d],[l,r][l, r][l,r]区间的中位数最大是多少,强制在线,1≤n≤20000,1≤m≤250001 \leq n \leq 20000, 1 \leq m \leq 250001≤n≤20000,1≤m≤25000。由于有a≤b≤c≤da \l原创 2021-05-12 19:25:08 · 214 阅读 · 0 评论 -
E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)
E. Sign on Fence给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai≤109,有mmm次询问,每次给定l,r,kl, r, kl,r,k,要我们在[l,r][l, r][l,r]区间内找到一个长度为kkk的区间,使得区间最小值最大,输出最大值。考虑二分答案,如果当前二分的区间是[l,r][l, r][l,r],我们把大于midmidmid的点,在数组中都设置为111,小于等于midmidmid的点,在数组中都设置为000,考虑用线段树原创 2021-05-12 17:11:29 · 534 阅读 · 0 评论 -
P1600 [NOIP2016 提高组] 天天爱跑步(线段树合并,lca)
P1600 [NOIP2016 提高组] 天天爱跑步给定一颗有nnn个点的树,有mmm个人在树上移动,第iii个人从sis_isi点,移动到tit_iti点,且他们按照最短路移动,每秒移动一条边的距离,点iii在wiw_iwi时刻有一个观察员,我们需要对每个点统计,在wiw_iwi时刻有多少个人恰好到达这个点。如果第vvv个人,在wuw_uwu时刻恰好出现在点uuu,则一定有dis(sv,u)=wudis(s_v, u) = w_udis(sv,u)=wu,且uuu在sv,tvs_v,原创 2021-05-10 21:31:32 · 328 阅读 · 0 评论 -
B. Alyona and a tree(dsu on tree + bit)
B. Alyona and a tree(dsu on tree + bit)给定一颗以111号节点为根的树,每个点有点权aia_iai,边有边权,如果vvv控制了点uuu,当且仅当uuu是vvv的子树中的节点且dis(u,v)≤audis(u, v) \leq a_udis(u,v)≤au,我们定义d(u)d(u)d(u)为点111到点uuu距离,则对于某个点vvv来说我们就是要在其字数上找d(u)−d(v)≤aud(u) - d(v) \leq a_ud(u)−d(v)≤au,d(u)−au≤原创 2021-05-10 12:09:20 · 200 阅读 · 0 评论 -
B. Lynyrd Skynyrd(倍增 + 区间最小值)
B. Lynyrd Skynyrd(segment tree + redouble)给定一个长度为nnn的排列ppp,一个长度为mmm的数组aaa,有mmm次询问,每次询问给定l,rl, rl,r,问在数组aaa中是否存在一个子序列构成的串是ppp的循环位移串,例如:pi,pi+1,…,pn,p1,p2,…,pi−1p_i, p_{i + 1}, \dots, p_{n}, p_1, p_2, \dots, p_{i - 1}pi,pi+1,…,pn,p1,p2,…,pi−1就是排列ppp的原创 2021-05-10 12:07:45 · 242 阅读 · 0 评论 -
E. Company(Codeforces Round #520 (Div. 2))
E. Company给定一颗有nnn个节点的树,有mmm次询问,每次询问给定[l,r][l, r][l,r],我们可以选择删除其中的一个点ppp,然后找到一个深度最深的rtrtrt,使得剩下的点都在rtrtrt的子树上。考虑对编号为[l,r][l, r][l,r]中的点,按照dfsdfsdfs序排序,容易想到,我们要么删除最前面的元素,要么删除最后面的元素,我们考虑枚举这两种情况,然后只要在剩下的点中随意挑选一个点,令其不断向上跳,知道找到一个点rtrtrt,剩下的点都在rtrtrt的子树上,这里可以原创 2021-05-07 19:51:28 · 265 阅读 · 0 评论 -
P3899 [湖南集训]谈笑风生(线段树合并)
P3899 [湖南集训]谈笑风生给定一颗以111号节点为根的树,如果a≠ba \neq ba=b,且aaa是bbb的祖先,则aaa比bbb更厉害,如果a≠ba \neq ba=b,且dis(a,b)≤xdis(a, b) \leq xdis(a,b)≤x,xxx为给定的一个数,则a,ba, ba,b紧邻。现有mmm次询问,每次询问给定p,kp, kp,k,为存在多少个三元组(p,b,c)(p, b, c)(p,b,c)满足一下条件:p,bp, bp,b都比ccc厉害。p,bp, bp,b彼原创 2021-04-28 20:00:06 · 205 阅读 · 0 评论 -
小 Q 与树(dsu on tree + segment tree)牛客练习赛 81 D
小 Q 与树给定一棵带权的树,每条边的距离都为111,要我们求∑u=1n∑v=1nmin(au,av)dis(u,v)\sum\limits_{u = 1} ^{n} \sum\limits_{v = 1} ^{n}min(a_u, a_v)dis(u, v)u=1∑nv=1∑nmin(au,av)dis(u,v),min(au,av)dis(u,v)=min(au,av)(dep[u]+dep[v]−2×dep[lca(u,v)])min(a_u, a_v) dis(u, v) = min(原创 2021-04-27 20:17:08 · 284 阅读 · 0 评论 -
Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]
Ancient Distance给定一颗根为111有nnn个节点的树,每次可以选定树上kkk节点当作特殊节点,定义dis(u)dis(u)dis(u)为,从u−>1u->1u−>1遇上的第一个特殊点的距离,如果遇不上特殊点则dis(u)dis(u)dis(u)无穷大。有nnn次询问,问,每次选k∈{1,2,3,…,n−1,n}k \in \{1, 2, 3, \dots, n - 1, n\}k∈{1,2,3,…,n−1,n}个特殊点时的答案,有一个性质,最大答案为n−1n - 1原创 2021-03-27 17:58:21 · 227 阅读 · 0 评论 -
P4211 [LNOI2014]LCA(离线 + 在线 做法)
P4211 [LNOI2014]LCA有一棵根节点为111树,有mmm次询问,每次给定l,r,zl, r, zl,r,z,输出∑i=lrdep[lca(i,z)]\sum\limits_{i = l} ^{r} dep[lca(i, z)]i=l∑rdep[lca(i,z)]。乍一看这题好像无从下手,仔细想想lca(i,z)lca(i, z)lca(i,z)有何性质,不难发现lca(i,z)lca(i, z)lca(i,z)一定是在1−>z1->z1−>z的路径上的,那么我们的答案原创 2021-03-25 22:22:46 · 238 阅读 · 0 评论 -
L 苍天阻我寻你,此情坚贞如一(西南科技大学2021届新生赛)(线段树)
苍天阻我寻你,此情坚贞如一给定两个长度为nnn的数组a,ba, ba,b,满足−103≤ai,bi≤103-10 ^ 3 \leq a_i, b_i \leq 10 ^ 3−103≤ai,bi≤103,每个数字xxx表示向前走xxx步,如果是负数则后退嘛,设小AAA执行aaa数组,小BBB执行bbb数组。有三种操作:把aaa数组中下标为xxx的数修改为yyy。把bbb数组中下标为xxx的数修改为yyy。如果小AAA起始位置在xxx,小BBB起始位置在yyy,问如果他们各自按照数组a,ba,.原创 2021-03-20 17:32:02 · 264 阅读 · 2 评论 -
Problem G. Pandaria(线段树合并 + Kruskal 重构树)
Problem G. Pandaria给定一个有nnn条边的无向连通图,每条边有对应的边权,每个点有一个颜色,问从一个点出发,经过不超过www的边权,所能到达的点中,颜色出现次数做多且颜色编号最小的是什么颜色。不超过某个权值所能到达的点,由此我们可以考虑建立升序kruskalkruskalkruskal重构树,然后从某个点倍增往上跳,直到不能跳为止,这个时候我们所在的点的子树所包含的点就是我们能够到达的点了,考虑用权值线段树来维护每一个点所代表的子树的信息,更新的时候我们只要往上进行线段树合并就行原创 2021-03-09 15:09:30 · 313 阅读 · 0 评论 -
2019ICPC西安邀请赛 E. Tree(树剖 + 线段树)
Tree给定一棵树,节点有点权,然后有三种操作:一、修改1−>s1->s1−>s的路径上的点权与ttt进行按位或。二、修改1−>s1->s1−>s的路径上的点权与ttt进行按位与。三、查询1−>s1->s1−>s的路径上的点权异或和是否为ttt。可以考虑树剖,然后对每一位维护一个010101线段树,然后push_uppush\_uppush_up区间111的个数即可,对于按位或操作,如果当前位为111,则区间覆盖为111,否则不做操作。对于原创 2021-02-23 20:53:48 · 307 阅读 · 1 评论 -
ICPC 南昌现场赛 K:Tree(dsu on tree + 动态开点线段树)
Tree让我们找满足一下五个条件的(x,y(x, y(x,y)点对有多少:x≠yx \neq yx=yxxx不是yyy的祖先yyy不是xxx的祖先dis(x,y)≤kdis(x, y)\leq kdis(x,y)≤kzzz是x,yx, yx,y的最近公共祖先,valuex+valuey=2valuezvalue_x + value_y = 2value_zvaluex+valuey=2valuez。读题目观察到每个节点的valuevaluevalue只有[0,105][0, 10原创 2021-02-09 20:27:06 · 309 阅读 · 0 评论 -
清明梦超能力者黄YY、异或树(线段树合并)
清明梦超能力者黄YY这题有点像【雨天的尾巴】【永无乡】的结合版本,树上差分,线段树合并,权值线段树查找第kkk大。对于操作iii,我们可以对u−>vu->vu−>v路径上的点,iii的权值加上111,然后线段树合并,查找第kkk大就好了。#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int head[N], to[N << 1], nex[N <<原创 2021-01-24 21:37:12 · 325 阅读 · 1 评论 -
线段树合并
线段树合并略谈线段树合并说全来就是动态开点权值线段树合并,所以你需要掌握权值线段树的基本知识以及知道什么是动态开点对于两个普通权值线段树如果暴力合并的话复杂度将会是nlognn \log nnlogn,更别说是合并nnn棵权值线段树了(炸空间,炸内存),但是在动态开点权值线段树中,这一操作是可以优化为logn\log nlogn的。具体处理如下:当这两棵树中有一个已经是空的了,我们只需要把有权值的一部分返回即可。当合并进行到叶子节点了,我们就需要对叶子节点的权值进行累加,然后再返回。如果不原创 2021-01-23 17:10:55 · 908 阅读 · 1 评论