随笔分类 - 题解类
摘要:首先计算在红绿灯 \((a,b)\) 处期望的等待时间。记 \(a+b\) 为一个周期(即先有时长为 \(a\) 的红灯,再有时长为 \(b\) 的绿灯),设我们在 \(x\) 时刻到达了这个红绿灯,那么我们需要等待的时间显然为 \(\max(a-x,0)\)。 要求出期望,就要用上面那个函数的和再
阅读全文
摘要:看到 \(n\le 18\),基本上是要做状压的。考虑进行预处理,然后在较小的复杂度内回答询问。设 \(f_{S,u}\) 表示当前走完了 \(S\) 中的点,现在在 \(u\) 点(\(u\in S\)),走完剩下的点的期望步数。于是有方程: \[f_{S,u}=1+\frac{1}{d_u}\s
阅读全文
摘要:要求结果为整数,我们将所有 \(a_i\) 分解质因数,对于每个质数分别考虑。 考虑对于一个左端点 \(l\),能满足要求的右端点一定在从 \(l\) 开始的一段连续区间中。于是我们得对于每个 \(l\) 求出 \(ans_l\) 表示那个最远的右端点。 对于一个质数 \(p\),假设 \(a_i\
阅读全文
摘要:首先有一个 \(O(n^2)\) 的 DP:设 \(f_{i,j}\) 表示前 \(i\) 分钟,当前朝上的面煎了 \(j\) 分钟的最小翻面次数。于是有方程: \[f_{i,j}=\min(f_{i-1,j},f_{i-1,i-j}+1) \]其中第二种转移是翻面的,即仅当 \(\exist k,
阅读全文
摘要:首先将枚举原排列中的区间转化为枚举值域上的区间。 从小往大对 \(r\) 扫描线,对于每个 \(l\in[1,r)\) 维护将 \([l,r]\) 在原排列中最少要分成多少段。显然只有 \(1\) 或 \(2\) 段才会产生贡献。那么我们用线段树维护值域上的每个 \(l\) 的最小段数,并维护值域区
阅读全文
摘要:看到“回到 \(x\) 后的状态”,显然考虑可持久化线段树。记开灯的为 \(1\),关灯的为 \(0\),对于每个询问只需去查某些点的权值和即可。 考虑怎么将符合条件的点转化为区间。询问的是同一深度的点,可以考虑 bfs 序。考虑如果 \(y\) 是奇数,显然答案为 \(0\);否则询问的点就是 \
阅读全文
摘要:新加的点不会影响之前的询问,所以直接离线,先把所有点都建好。 将问题转化为:用 \(b\) 数组减去 \(a\) 数组,得到的形如 \(1,2,3,\dots\) 的等差序列的最大长度。 考虑将两个序列哈希,预处理出等差数列的哈希值,二分长度即可。而在树上维护路径数组的哈希值,可以用倍增解决。 时间
阅读全文
摘要:考虑一次询问,显然 DP,设 \(f_{u,0/1}\) 表示走路/坐船到 \(u\) 点的最小花费即可。 多次询问,考虑维护矩阵,广义矩阵乘,倍增处理询问。比如对于一条顺流的边 \(i\),可以构造矩阵: \[\begin{bmatrix} a_i&L+a_i-z_i\\ a_i&a_i-z_i
阅读全文
摘要:设 \(f_{u,i}\) 表示 \(u\) 接受 \(i\) 的信号,\(u\) 的子树内的答案。那么可以枚举 \(u\) 的儿子 \(v\) 接受信号的节点来转移。注意当 \(v\) 也枚举到 \(i\) 时要减去重复的 \(k\)。 考虑构造方案,设 \(ans_u\) 表示答案。首先可以求出
阅读全文
摘要:分块,设块长为 \(B\),预处理 \(f_{l,r,x}\) 表示仅考虑 \([1,l]\cup[r,\frac{n}{B}]\) 中的玩具,花 \(x\) 元的最大愉悦度。询问时向 \(f_{bel_l-1,bel_r+1}\) 中加入 \(l\) 和 \(r\) 所在块内的玩具即可。\(bel
阅读全文
摘要:考虑如果没有修改,用 ST 表就非常舒服。 考虑暴力修改,需要修改所有覆盖了这个位置的区间,时间复杂度是 \(O(n)\) 的。 而如果只修改 \(\frac{\log n}{2}\) 层,时间复杂度就是 \(O(\sqrt{n})\) 的。查询时从上往下查,最多查到第 \(\frac{\log n
阅读全文
摘要:考虑如果暴力 DP,设 \(f_{i,j}\) 为当前的串长为 \(i\),在 AC 自动机的 \(j\) 节点的概率。转移时枚举在后面加的字符 \(k\),如果加上 \(k\) 后匹配上了一个禁忌串就直接回到根节点,同时给答案贡献,否则就继续匹配。\(len\) 在 \(10^9\),时间复杂度会
阅读全文
摘要:设 \(dp_{i,j,S}\) 表示填了 \(i\) 位,在 AC 自动机上的 \(j\) 号节点,当前覆盖的字符串集位 \(S\) 的方案数。于是有转移: \[\large{dp_{i,j,S}\to dp_{i+1,tr_{j,k},S\operatorname{or}sta_{tr_{j,k
阅读全文
摘要:容易发现相交的区间是不会产生贡献的。于是不用考虑这个限制。 用单调栈可以求出以 \(a_i\) 为最小值和最大值的区间个数 \(qmn_i\) 和 \(qmx_i\)。 从小到大枚举第二个区间的最小值,记 \(p_i\) 表示 \(i\) 的位置,则对于 \(i\) 的答案即为: \[\sum_{j
阅读全文
摘要:\(k\le 20\),考虑 \(O(2^k)\) 暴力枚举加入的边。但是边数很大,时间复杂度很高无法承受。 考虑在一开始强制选这 \(k\) 条边,然后跑最小生成树,此时加入的边就是一定会加入的边。设这个边集为 \(S\)。 将 \(S\) 连接的连通块缩成点,点数为 \(O(k)\)。再在原图上
阅读全文
摘要:考虑初始的答案,显然为卡特兰数 \(H(n)\)。 考虑加入一对括号 \((l,r)\) 时对答案的贡献。(\((l,r)\) 表示有一对括号,左括号在 \(l\),右括号在 \(r\)。) 我们默认一开始有一对括号 \((0,n+1)\)。当出现一对括号 \((l,r)\) 时,首先要加上 \((
阅读全文
摘要:很巧的 trick。 首先离线。从大到小扫 \(l\),维护数组 \(p_i\) 表示当前出现 \(i\) 的最小的位置。 显然当确定了左端点,从左到右的 \(\operatorname{mex}\) 是单调不降的。因此我们要求的就是一段区间 \([l',r']\),满足 \(\operatorna
阅读全文
摘要:问题显然可以分为两部分:\(u\) 的子树内和 \(fa_u\) 到 \(v\) 的链上。前者需要树上背包,后者需要取 \(\max\)。 考虑用线段树维护这两个值。子树内的答案只需要一次区间查询,再加上树上背包的 \(O(m^2)\),总共为 \(O(m^2\log n)\)。链上的答案需要进行树
阅读全文
摘要:简单手摸后发现,答案就是这么一个式子: \( (3^{n-1}-3^{n-2})a_1+(3^{n-2}-3^{n-3})a_1a_2+\dots+(3^1-3^0)a_1a_2\dots a_{n-1}+a_1a_2\dots a_n \) 啊当然证明也是好证的,对于 \(a_1\) 这一项,它后
阅读全文
摘要:记 \(f(x)\) 为最小的大于 \(x\) 的 \(y\),使得 \(x\) 是 \(y\) 的子串。易得: \[f(x)=\min(10x,x+10^{|x|}) \]其中 \(|x|\) 表示 \(x\) 的位数。 可以发现,\(f(x)\) 为一个严格单调递增的函数。 考虑贪心策略,显然选
阅读全文