11 月做题记录(二)
我的想法应该是同步更新所有的做题记录,不同的做题记录对应不同的题源,这有道理吗?
但是这个题单里的题应该做不完,因为还要改模拟赛。
只能说我以前太摆烂了,后悔莫及啊。。。当然不是说我现在就不摆的意思。
11.9 待黑白分明
已通过。
题目链接。
题意相当于 \(i\) 如果能不换乘到达 \(j\),就有 \(\min(p_i,p_j)>\max_{k=i+1}^{j-1} p_k\)。
建立笛卡尔树,合法的 \(j\) 在 \(i\) 左儿子的右链上,右儿子的左链上。
可以写一个 dp:\(f_{i}\) 表示以 \(i\) 结尾的 \(S\) 的方案数,\(g_{i,0}\) 表示左链上 \(f\) 的和,\(g_{i,1}\) 表示右链上 \(f\) 的和。
设左儿子是 \(l\),右儿子是 \(r\),转移为:\(f_{i}=g_{l,1}+g_{r,0}\),\(g_{i,0}=f_i+g_{l,0}\),\(g_{i,1}=f_i+g_{r,1}\)。
可以写成矩阵的形式。
把询问按照 \(l\) 从大到小排序,每次给 \(l\) 处添加 \([1,1,1]\) 的贡献,重算 \(l\) 的祖先。查询就是查询 \(i\le r\) 的 \(f_i\) 的和。
树分块,选出 \(B\) 个关键点。修改时先跳到关键点,预处理关键点的三个权值对 \(f\) 造成的影响。
查询的时候有两部分贡献:关键点后的贡献可以枚举所有关键点求和。关键点前的贡献是暴力跳,并用 \(O(1)-O(\sqrt{n})\) 分块平衡。
时间复杂度 \(O(n\sqrt{n})\)。
11.9 呼吸之野*
题目链接。
询问时,好区间的要求是长度 \(\ge k\) 且中位数 \(\ge x\)。把 \(a_i\ge x\) 的 \(b_i\) 设为 \(1\),\(a_i<x\) 的位置 \(b_i\) 设为 \(-1\),那么一个好区间的条件是 \(b_i\) 的和 \(\ge 0\)。
设 \([f_i,i]\) 表示以 \(i\) 为右端点长度最小的好区间。如果存在 \(j<i\),满足 \(f_j\ge f_i\),那么 \([f_j,j]\subseteq [f_i,i]\),这就不是一个极小的好区间。
容易证明,随着 \(x\) 的增大,一旦 \([f_i,i]\) 不再是极小的好区间,\(x\) 更大时它也不会是。问题变成找到 \(t_i\),表示最大的 \(x\) 使得 \([f_i,i]\) 还是一个极小的好区间。
在序列上扫描线。为了研究在 \(x\) 时 \([f_i,i]\) 是一个极小的好区间的条件,需要找到上一个好区间 \([f_j,j]\)。
如果 \(b[j+1,i]\) 的和 \(>0\),则 \(f_i>f_j\) 是显然的。
如果 \(b[j+1,i]\) 的和 \(\le 0\),那 \(a[f_i,j]\ge 0\)。而由于 \(j-f_i+1<k\),所以 \(j\) 才不能直接选到 \(f_i\)。
所以 \(j-k+1<f_i\le i-k+1\)。
整理一下:设 \(b\) 的前缀和是 \(s\),那么条件是 \(s(j-k,i-k]\) 的最小值 \(\le s_i\),或者 \(s_j< s_i\)。
在序列扫描线时,设 \(w_{x}\) 表示这个 \(x\) 对应的 \(s_i-s_j\) 的值,\(M_x\) 表示这个 \(x\) 对应的 \(s(j-k,i-k]\) 的最小值。再维护一个 \(s_{i-k}\) 的值。
只需二分,用一个不 Leafy 的线段树来维护这个东西即可,无需 pushup,只需要打标记。\(M_x\) 的维护方式类似历史最值。当 \(t_i\) 被求出后 \(x\in [1,t_i]\) 需要被修改。
考虑查询,所有 \(t_i\ge x\) 的位置都是合法的右端点。再倒着求一次合法的左端点。显然是一一对应的,二分即可。
不难写,晚点再写。
td 研心
题目链接。
td 夏终
题目链接。
td Variations on Silent Rhapsody
题目链接。
td 填数游戏
题目链接。
td 猫和老鼠
题目链接。

浙公网安备 33010602011771号