随笔分类 - 数据结构-线段树
摘要:[51nod 1681]公共祖先(dfs序+线段树合并) 题面 给出两棵n(n include include include define maxn 100000 define maxlogn 25 using namespace std; int n; struct segment_tree{
阅读全文
摘要:[51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树) 题面 给出一棵N个点的树,Q次询问一点编号在区间[l1,r1]内,另一点编号在区间[l2,r2]内的所有点对距离最大值。$N, Q≤100000$ 分析 看到区间,我们应该想到用线段树维护,区间[l,r]存储编号在[l,r
阅读全文
摘要:[Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有一个数列$f_i$满足$f_0=f_1=1,f_i=f_{i 1}+f_{i 2}(i 2)$(就是
阅读全文
摘要:[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点。每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i]。如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色。定义depth[i]为i节点与根节点的距离。为了方
阅读全文
摘要:[Codeforces 280D]k Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不相交的子区间,使得这至多k个子区间中数的和最大 分析 极其毒瘤的线段树,要维护18个变量 首先考虑查
阅读全文
摘要:[Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是$2^{x_i}(x_i include include include include include define maxn 500000 define maxm
阅读全文
摘要:[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。 给你一个长度为n的序列s。 回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位
阅读全文
摘要:题面 题意:给你一个数组a[n],对于数组每次建立一个完全k叉树,对于每个节点,如果父节点的值比这个节点的值大,那么就是一个违规点,统计出1~n 1完全叉树下的违规点的各自的个数。 分析 注意到完全k叉树的一个性质,v节点的儿子是k (v 1)+2...kv+1,v节点的父亲为(v+k 2)/k 那
阅读全文
摘要:题面 单点修改,区间求第k大 分析 首先,这道题卡权值线段树套treap的做法,所以只能用主席树做 对于静态的查询,root[i]对应的主席树的区间[l,r]保存的是a[1]~a[i]有多少个值落在区间[l,r]内。如果我们要修改a[i],则要修改O(n)棵主席树。那么我们像树状数组那样维护n棵主席
阅读全文
摘要:题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那么查询我们直接在第i棵主席树里查第k大即可 注意: 1.主席树里面要维护两个值,一个是值落在区间[l
阅读全文
摘要:题面 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。 分析 第i棵主席树存储dfs序(dfn)为i的节点到根的链上序列,按dfn更新 查询用
阅读全文
摘要:题面 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的。
阅读全文
摘要:题面 "传送门" 分析 对于每一个数a[i],找到它后面第一个大于它的数a[p],由p向i连边,最终我们就会得到一个森林,且p是i的父亲。为了方便操作,我们再增加一个虚拟节点n+1,把森林变成树。 由于序列不是递增的,不能二分。维护一个单调栈,栈顶元素最小。从n到1依次对每个 数操作,弹出栈里比它小
阅读全文
摘要:题面 "传送门" 分析 观察题目中的这段伪代码,发现实际上就是求出每个节点的DFS序, 注意 ,要按编号从小到大访问每个节点,所以要对邻接表排序(可以用vector实现) 对询问离线,每个结点保存由该节点出发所有询问 第一次DFS, 求出每个点到根节点的距离,以及DFS序。顺便把每个节点的子树对应的
阅读全文
摘要:题面 "传送门" 分析 主体思路:若x能引爆y,从x向y连一条有向边,最后的答案就是从x出发能够到达的点的个数 首先我们发现一个炸弹可以波及到的范围一定是坐标轴上的一段连续区间 我们可以用二分查找求出炸弹能波及到最左边和最右边的点,记为[l,r] 然后我们就需要向编号属于区间[l,r]的点连一条有向
阅读全文
摘要:题面传送门分析此题是道好题! 首先要跳出思维定势,不是去想如何用数据结构去直接维护排序过程,而是尝试二分a[p]的值 设二分a[p]的值为x 我们将大于x的数标记为1,小于等于x的数标记为0 则整个序列只由01组成,记为b 将一个区间升序排序,则相当于将1全...
阅读全文
摘要:题面传送门分析此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根节点走到x,将点归0,再把最大值累加 然而,修改操作怎么做呢? ...
阅读全文
摘要:题面传送门分析首先我们观察到区间范围较大,而区间个数较少,考虑离散化,将所有询问按照右端点进行排序 离散化之后研究区间颜色个数变化的规律 当我们处理到第a[i]个段时,设a[i]上一次出现的地方为last[a[i]],则last[a[i]]之前的颜色出现次数...
阅读全文
摘要:题面传送门 题目大意:给定初始根节点为1的树,有3种操作 1.把根节点更换为r 2.将包含u,v的节点的最小子树(即lca(u,v)的子树)所有节点的值+x 3.查询v及其子树的值之和分析看到批量修改子树,我们想到将树上操作转化为区间操作 通过DFS序我们可...
阅读全文
摘要:题面传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u,v)表示u,v之间的距离 操作2:查询节点u的值分析这类题目...
阅读全文

浙公网安备 33010602011771号