5月补题
反思一下自己最近在干什么。
NOI 模拟 #15
A. 序列
想到了分治结构维护,但没有简化信息的思想。
正解:
考虑求解 \([l, r]\) 的答案,关注区间中最小值 \(a_{mn}\) 出现的位置组成的若干连续段。设一个连续段长度为 \(len\)。当 \(len\) 偶数的时候,应当将其合并成长度为 \(len/2\) 的 \(a_{mn}+1\) 段。否则必然剩下的一个 \(a_{mn}\) 将求解区间断成两半,分别求答案即可。
考虑在线段树上维护这个过程。观察到,一个区间中若存在 \(a_i<a_{i-1} \land a_i<a_{i+1}\),则 \(a_i\) 必然被合并。这时区间可能被分隔,考虑合并区间时将分隔合并,记录分隔中间的答案,则我们最后得到的区间是单峰的,且峰顶可能有分隔。将相邻相等的 \(a_i\) 压成一个则序列长度只有 \(O(\max(a_i)+\log2(n))\)。于是维护合并的过程可以接受。
\(\color{red}{没补出来,菜了}\)
B. 染色
构造题,没意思。
考虑以 \(u\) 为根的子树记作 \(sub(u)\)。\(sub(u)\) 同外界的连边只有三个:\(u\) 的父亲 \(fa_u\),\(sub(u)\) 中最左右的儿子 \(L_u, R_u\)。
假设 \(fa_u,L_u,R_u\) 颜色相同。
构造 1.
暴力一点,将 \(fa_{L_u}\) 到 \(u\) 并 \(fa_{R_u}\) 到 \(u\) 染上一种新的颜色,遍历路劲上的除了 \(u\) 以外的点 \(x\) ,将 \(L_x,R_x\) 也染上这个颜色。并递归下去。容易检查这是一个合法构造,且一种颜色的点数是 \(O(\log 总点数)\) 的。这个方法可以得到 60pts。
正解(构造 2.
称 \(Lu\) 到 \(fa_u\) 链上的点顺次为 \(ver_1 \sim ver_k\),\(R_u\) 到 \(fa_u\) 链上的点顺次为 \(ver_1' \sim ver_k'\)。对于 \(1<x \le (k-1)/2\),我们将 \(ver_{x+1}, ver_{k-x}, ver_{x+1}', ver_{k-x}'\) 染上同一种新颜色。然后同样遍历 \(fa_{L_u}\) 到 \(fa_{R_u}\) 除了 \(u\) 以外的点 \(x\),染 \(L_x,R_x\) 和 \(x\) 相同的颜色。可以检查这是一个合法构造。
再评:补了这个题跟没有补好像没啥区别。
NOI 模拟 #14
A. 清晰人类
对时间轴分治,每 \(B\) 的操作分一组。考虑第 \(k\) 组操作中的询问,前 \(k-1\) 组操作中修改的贡献可以一起做持久化线段树合并预处理,单组 \(O(\log n)\) 查询。第 \(k\) 组操作中直接枚举询问前的修改操作,每个修改操作的贡献可以 \(O(1)\) 计算。
考虑总时间复杂度:\(O(n^2 \log n/B+nB)\)。理论复杂度取 \(B=\sqrt{n \log n}\) 达到最优 \(O(n \sqrt{n \log n})\)。实际上应取 \(B\) 较大平衡线段树合并常数。
B. 人造光
忽略 \(P_A=B\) 的限制,打表发现答案是卡特兰数。于是尝试想办法将刻画合法排列的过程和卡特兰数扯上关系。通常可以考虑转移式可以表达为格路计数的 DP。
观察一个合法排列 \(P\)。其最大元素的左边是比其小的若干元素递降排序,再考虑其右边,又可以在找出新的最大元素,然后递归这一过程。如果对 \(P\) 建出笛卡尔树,应形如根挂着一条右链,右链每个点左儿子可能又挂着一个右链。
排列 \(H=n,n-1,n-2,\cdots,2,1\)。合法方案形如钦定根右链上的元素,并在 \(H\) 中标记出来,不影响其标记元素相对顺序的前提下将它们任意往后面(指标增大的方向)移动。
依照这个形式,考虑通过 DP 计数。设 \(f_{i,j}\ (i \ge j)\) 表示考虑元素 \(1 \sim i\),钦定了元素 \(i\) 移动到位置 \(j\) 的方案个数。有转移式:
其中 \(j' \le i+1\) 是为了保证不存在不作为任何钦定点右链的节点。但是这个限制显然不好处理。考虑转移 \((i,j) \to (i',j')\),其中 \(j'>i+1\)。则 \(i+1 \sim j'-1\) 没有被归入任何右链。这时我们强制钦定它们所有点,并且没有左儿子,同时要求 \(f_{i, j}\) 中 \(j<i\)。这样第三个限制就没了。
新的 DP 式容易转成格路计数。接下来只需要把统计路径个数的组合数推出来即可。
NOI 模拟 #21
A.
设 \(f_c\) 表示一直操作直到所有位置颜色都为 \(c\),操作次数的期望;\(p_c\) 表示第一次所有位置颜色相同时颜色为 \(c\) 的概率,\(g_c\) 表示若第一次所有位置颜色相同时颜色为 \(c\),操作次数的期望。
考虑钦定一个元素,研究其存在 \(i\) 个时期望多少次操作使得每个位置的颜色都为它,记作 \(dp_i\)。则 \(f_c=dp_{cnt_c}\)。
有等式:
对 \(f\) 求和可得式子:
考虑解 \(dp_i\)。发现 \(dp_i\) 仅和 \(dp_j(j\le i+1)\) 相关。
-
guass 消元得到 \(n^3\) 做法。
-
可以写出 \(dp_{i+1}\) 关于 \(dp_j(j\le i)\) 的式子。设 \(dp_0\) 为变元递推,解出后回代,得到 \(n^2\) 做法。
这题神奇在对答案计算的转化上,即若存在随机变量集合 \(S\)。\(x_i\in S\) 表示事件 \(i\) 第一次发生的时间。求 \(E(\min_{x\in S}(x))\)。
这种类型的题通常都手段有 \(\min\max\) 容斥。但本题由于终止状态的统一性可以推出解仅跟 \(E(x)\) 相关的表达。
B.
简单题。
考虑链上的做法:扫描线维护每个颜色最后一次出现的位置,套线段树历史和即可。
搬到树上依靠了题目的特殊性质:树的构造为 \(k\) 个点组成一条链,剩下的 \(n-k\) 的点随机父亲。则任意一个点距离最近的一个在链上的祖先距离为 \(O(\log n)\) 的。于是枚举一些东西就能 \(O(n\log ^2n)\)。
NOI 模拟 #23
A. 宝石
交换贪心:设最优解点集为 \(S\),按 \(a_i+b_i\) 对 \(S\) 中元素排序一定能构造出合法解。
设计 dp 状态 \(f_{i, j}\) 表示前 \(i\) 个元素选择了 \(j\) 个的最小 \(C\) 值。
转移:
考察第二种转移作为决策的条件 : \(f_{i,j}+a_{i+1}<f_{i,j+1},f_{i,j} \le b_{i+1}\)。
其和 \(f_i\) 的差分有关,并不好维护。打表发现 存在凸性。于是可以使用平衡树维护 DP 转移。
考察知识点:
- 交换贪心
- 凸性利用
C. 前缀和
非常有价值的题目。
常规做法:离线扫描线(40pts)
正解:
顺延扫描线的思想,考虑最大值起到的划分作用。
记 \(mx[l,r]=\max_{i \in [l,r]} a_i\)。
设
考虑 \(FL_i\) 为 \(i\) 左边第一个比 \(i\) 大的元素。有:
\(suf_i=suf_{FL_i}+(i-FL_i)a_i\)。
再考虑固定求解区间 \([L,R]\),解其固定子区间右端点的后缀答案和。
\(for\ r \in [L,R]\)
记 \(mxp\) 为 \([L,r]\) 中最大元素的位置。
我们要做的是 \(Q(r)\) 的和。如果尝试将 \(r\) 的贡献统计到 \(mxp\) 上会发现:\(mxp\) 是 \([L,R]\) 的前缀最大值。我们可以类比 \(FL\) 设计 \(FR\) 往后跳找到所有前缀最大值,两个前缀最大值之间的 \(r\) 都会被统计到左边的一个。类比 \(suf\) 预处理链的前缀和即可。最后一个前缀最大值单独处理,它的位置即 \([L,R]\) 中的最大值位置。
NOI 模拟 #24
A. guo1e
不妨求出最后为白色的概率设为 \(f(n,k)\)。答案就是 \(1-f(n,k)\)。
第一次覆盖后,数组中白色位置会变成独立的两部分,位置 \(k\) 可能被盖掉或位于其中的一个部分。以此构造子问题得到递推式。
通过前缀和优化可以得到 \(O(n^2)\) 做法。
考虑数组的 \([1,k]\) 和 \([k,n]\) 两部分。导致位置 \(k\) 被覆盖的操作有 \((k-1,k)\) 和 \((k,k+1)\) 两个。在它们均不被进行时两部分独立。总之 \(\color{red}{f(n,k)=f(k,k)f(n-k+1,1)}\)。
有 \(f(k,k)=f(k,1)\)。预处理后复杂度为 \(O(n+q)\)。
B. 串串
这位更是重量级。
给一个更好的形式化题意:有串 \(S\)。称 \(S\) 的子串 \(T\) 覆盖 \(S\),当且仅当可以构造出数列 \(i_1<i_2<\cdots<i_p\)。\(\forall k\in[1,p]:\ i_k+|T|>i_{k+1}\),且 \(i_1\le 1,i_p+|T|>|S|\)。要求 \(\forall k\in[1,p], j\in[1,|T|]: S_{i_k+j-1}=T_{j} \lor i_k+j-1\notin [1,|S|]\)。
建出 \(endpos\) 树。对于节点 \(u\) 考虑 \(T\) 的 \(endpos\) 集为 \(u\)。则 \(|T|\) 需要满足一些限制,首先 \(mxlen_{fa_u}< |T|\le mxlen_u\)。设 \(endpos\) 中相邻间距最远两个位置差为 \(dif\)。则有 \(|T|\ge dif\)。
接下来考虑 \(S\) 的前缀被 \(T\) 的后缀覆盖,及 \(S\) 的后缀被 \(T\) 的前缀覆盖。发现覆盖部分分别为 \(S\) 的一个前缀的 border 和一个后缀的 border。设数组 \(z_1(p)=\max_{i<p} (i),S[p-i+1,p]=S[1,i]\),\(z_2(p)=max(i)_{i\le n-p},S[p,p+i-1]=S[n-i+1,n]\)。
设 \(endpos\) 中第一个和最后一个位置为 \(r_1\) 和 \(r_2\) 则对 \(|T|\) 有要求 \(z_1(r_1)\ge r1-|T|,z_2(r_2-|T|+1)\ge n-r_2\)。
总结限制发现可以使用二维数点。维护主席树就可以求出第一问的答案。第二问多维护一个区间哈希更新最短 \(T\) 的最优字典序即可。总复杂度 \(O(n\log n)\)。
这是谁 tm 想出来的题目,为啥代码这么长。
NOI 模拟赛 #25
A. 路径
sub 1.
最开始给边赋权 \(1 \sim m\)。若这时 \(S \sim T\) 的最短路长度 \(> D\),则判断无解。否则考虑一种调整法。每次找到 \(S \sim T\) 的最短路,设其长度为 \(D'\)。若 \(D'=D\) 则构造成功。否则找到其中最大的边,将图中大于等于它的边增加 \(D'-D\) 的边权。
分析时间复杂度:每找到一条最短路,就会封死一条边(其中的最大边不会在之后 \(D'<D\) 的最短路中出现)。故复杂度为 \(O(nm\log m)\)。
sub 2.
考虑快速封死所有的边。仍先给边赋权 \(1 \sim m\)。二分得到最小的 \(\lambda\) 使得保留前 \(\lambda\) 大的边可以得到 \(S \sim T\) 长度 \(D' \le D\) 的路径。然后我们将边权 \(> \lambda\) 的边增加 \(INF\),边权 \(= \lambda\) 的边边权增加 \(D-D'\)。
这样对于任意一条 \(S \sim T\) 的路劲,若包含任意 \(\ge \lambda\) 的边。则路劲长度必然为 \(D\) 或 \(INF\)。否则路径长度必然 \(>D\)。