随笔分类 - 主席树
摘要:二分答案后相当于判断一个区间的后缀与某个后缀的最长公共前缀是否能>=ans。建出后缀树,在上述问题中后者所在节点向上倍增的跳至len>=ans的最高点,然后相当于查询子树中是否有该区间的节点。主席树进行二维数点即可。
阅读全文
摘要:先考虑80分做法,即满足A串长度均不小于B串,容易发现每个B串对应的所有A串在后缀数组上都是一段连续区间,线段树优化连边然后判环求最长链即可。场上就写了这个。 100分也没有什么本质区别,没有A串长度不小于B串的性质后,区间连边变成了矩形连边,用主席树或KDTree优化连边即可,当然主席树会更靠谱,
阅读全文
摘要:考虑按顺序暴搜子序列。如果序列中的数两两不同,显然每次给上一个找到的子序列添上后缀最小值,即为下一个要找的子序列。如果不能再加了就回溯继续考虑后缀次小、第三小……值,直到找到k个子序列。 有重复的数后,考虑后缀k小值只取第一次出现的位置,并在每找到一个子序列后就统计其出现次数。显然这样就能找到所有要
阅读全文
摘要:显然集合后相对位置不变最优。主席树上二分向左和向右的分界点即可。注意主席树的值域。我怎么天天就写点一眼题啊。
阅读全文
摘要:在子树内和距离不超过k是一个二维限制,容易想到主席树,但主席树显然没法查最小值,因为不满足区间可减。kdtree和二维线段树可以干这事,但肯定会T飞。但事实上我们的问题有一个特殊性:对某个点x,查询其子树中的depth[x]~depth[x]+y和0~depth[x]+y这两种深度区间实际上是相同的
阅读全文
摘要:相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量。这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧。那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区间。这个区间可以二分+st表求出。于是枚举右端点,在其合法区间内查询有多少个合法左端点(即合法区间包
阅读全文
摘要:考虑没有深度限制怎么做。显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log。 另一种做法是利用树上差分。对于同种颜色的点,在每个点处+1,dfs序相邻点的lca处-1,那么查询子树颜色数就只需要查询子树和了。 然后加上深度限制。考虑将点一层层加进去,利用se
阅读全文
摘要:显然最优策略是先走到一边要到达的最远城市,再换方向走到另一边要到达的最远城市(当然也可以直接停止),路上参观景点。 先仅考虑求出只向左走,花费时间i时的最优解。如果能求出这个,类似的就可以求出所有情况。 显然时间越长,应该往左边走的越远,参观的越多,但是这个最远城市的变化不一定连续,没法愉快地双指针
阅读全文
摘要:感觉非常不可做,于是考虑有什么奇怪的性质。 先考虑怎么求子集和mex。将数从小到大排序,假设已经凑出了0~n的所有数,如果下一个数>n+1显然mex就是n+1了,否则若其为x则可以凑出1~n+x所有数。 对于区间查询,建棵主席树即可,每次查询权值线段树上lastn+2~n+1的区间,用区间和更新n,
阅读全文
摘要:可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集。于是建出重构树,就可以知道每个询问的连通情况了。现在要知道的是两个连通块的交集,考虑每个点是否有可能在里面。于是按照两棵重构树的dfs序给每个点一个二维坐标
阅读全文
摘要:kruskal重构树本质就是给并查集显式建树来替代可持久化并查集。将边按困难度从小到大排序后建出该树,按dfs序建主席树即可。查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大。
阅读全文
摘要:因为不会SAM,考虑SA。将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法。 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了。这是一个主席树的经典问题,对每个数找到上次出现位置扔进去即可。这样就做到O(nlog2n)了。 可以进一
阅读全文
摘要:与中位数有关的题二分答案是很常用的trick。二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0。 由于每个位置是1还是-1并不固定,似乎不是很好算。考虑暴力一点的想法:对于每一种答案预处理。这样查询就很好办了,线段树上每个区间维护最大前缀和后缀和及总
阅读全文
摘要:考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑;询问某点到所有黑点的距离之和。 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2。要求出上面的东西,depth[x]+depth[y]可以很简单的算出来,关键在于depth[lca(x,
阅读全文