随笔分类 - 数据结构-线段树
摘要:题目 点这里看题目。 分析 一些简单的转化: 其一,将原先的区间 \([L,R]\) 都变成 \([L,R-1]\) ; 其二,将 \([L_i,R_i]\) 变成 \([L_i-i,R_i-i]\) ,这样就不需要考虑时间的自然流逝了。 考虑一个简单的贪心:维护当前的时间 \(t\) 。如果下一段
阅读全文
摘要:题目 点这里看题目。 分析 设未交换时的结果为 \(c\) ,记 \(s\) 为前缀和数组。 那么考虑将 \(i\) 交换到 \(j\) 之后( \(j<i\) ),交换的变化量为: \[ \begin{aligned} &\Delta=(s_i-s_j-A_i)+(j+1-i)A_i\\ \Rig
阅读全文
摘要:题目 点这里看题目。 分析 看到链的限制很奇葩, " 存在一个重要的选择 " ,于是就不难想到容斥。 首先定义 \((u_1,v_1)\cup (u_2,v_2)\) 表示求两条路径的边的并集。 显然容斥式子长这个样子: \[ \sum_{S\subset Q} (-1)^{|S|}\times 2
阅读全文
摘要:题目 点这里看题目。 分析 如果这道题可以换根,那它就是一道水题,可是换不得。 我们首先考虑 \(p\) 是根的时候应该怎么做。可以发现,对于所有情况总存在: \[ \bigcap_{i=l}^rE(p,i)=E(p,\text{LCA}[l,r]) \] 这里我们认为 \(\text{LCA}[l
阅读全文
摘要:题目 点这里看题目。 分析 以下标记子串的方法为: \(S[l,r]\) 表示 \(S\) 中从 \(l\) 到 \(r\) 的字符组成的子串。用 ( 表示开区间, [ 表示闭区间。 我们不难想到一个 DP : \(f(i,k)\):以 \(i\) 开始的后缀,结尾字符串长度为 \(k\) 时的最长
阅读全文
摘要:题目 点这里看题目。 分析 最妙的地方在于,这道题其实是用一种数据结构模拟另一种数据结构! 我们需要维护深度和树的结构,以下对于每个操作进行分别讨论。 插入一个新节点 可以发现,这个新节点一定会成为自己的前驱或者后继中深度较大者的儿子。 然后可以更新深度和树的结构。 单旋最小值 发现树会有如下的变化
阅读全文
摘要:# 题目 点这里看题目。 分析 一个真正的树套树的题目。 大体思路非常简单,就是把从模板树上面复制下来的子树用一个点来代表,再插入到大树里面。接着就“正常”地维护一下倍增和深度,查询也跟“正常”的一样,先查 LCA ,再用深度做差。这种思路......形象地称为树套树。 什么,你说这是水题?开什么玩
阅读全文
摘要:题目 点这里看题目。 分析 考虑将所有子序列画成$n\times n$的表的形式,表中的元素$(x,y)$就表示子序列$a[x:y]$的最小值。($x>y$则$(x,y)=0$) 那么,对于一个元素$a_i$,记它左边第一个小于它的位置为$lef(i)$,右边第一个小于等于它的位置为$rig(i)\
阅读全文
摘要:题目 点这里看题目。 分析 由于这个问题与子串相关,那么我们就先把后缀自动机给建出来。 题目条件非常特殊——“出现至少两次”。而 fail 树上一个状态的祖先状态,根据定义,至少会在当前状态中出现一次。我们便可以知道,答案所对应的状态在 fail 树上一定呈祖孙关系。 我们可以用倍增法,求出状态 \
阅读全文
摘要:题目 点这里看题目。 分析 先对所有的模式串建立广义后缀自动机。 我们需要求出每个节点的$end-pos$集合,这个可以在 \(fail\) 树上用线段树合并快速预处理。 考虑询问。由于字符串的子串就是前缀的后缀,因此我们可以对于每个前缀,处理出它在自动机上的$LCS$对应的节点。那么一个子串在自动
阅读全文