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\) 的方案个数。有转移式:

\[f_{i, j}=\sum_{i'<i, j'<j, j' \le i+1} f_{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}\)

有等式:

\[ans=\sum_{c=1}^n p_cg_c \\ f_c=p_cg_c+\sum_{c' \neq c} p_{c'}(g_{c'}+dp_0) \\ \]

\(f\) 求和可得式子:

\[\begin{aligned} \sum_{c} f_c &= p_cg_c+\sum_{c'\neq c} p_{c'}(g_{c'}+dp_0) \\ &=n\sum_c p_cg_c+(n-1)dp_0\sum_{c} p_c \\ &=n\times ans+(n-1)\times dp_0 \\ ans&=\frac{\sum_c f_c-(n-1)dp_0}{n} \end{aligned} \]

考虑解 \(dp_i\)。发现 \(dp_i\) 仅和 \(dp_j(j\le i+1)\) 相关。

  1. guass 消元得到 \(n^3\) 做法。

  2. 可以写出 \(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} \to f_{i+1,j} \\ f_{i,j} + a_{i+1} \to f_{i+1,j+1} \ (f_{i,j} \le b_{i+1}) \]

考察第二种转移作为决策的条件 : \(f_{i,j}+a_{i+1}<f_{i,j+1},f_{i,j} \le b_{i+1}\)

其和 \(f_i\) 的差分有关,并不好维护。打表发现 存在凸性。于是可以使用平衡树维护 DP 转移。

考察知识点:

  1. 交换贪心
  2. 凸性利用

C. 前缀和

非常有价值的题目。

常规做法:离线扫描线(40pts)

正解:

顺延扫描线的思想,考虑最大值起到的划分作用。

\(mx[l,r]=\max_{i \in [l,r]} a_i\)

\[suf_{r}=\sum_{i \le r} mx[i,r] \]

考虑 \(FL_i\)\(i\) 左边第一个比 \(i\) 大的元素。有:

\(suf_i=suf_{FL_i}+(i-FL_i)a_i\)

再考虑固定求解区间 \([L,R]\),解其固定子区间右端点的后缀答案和。

\(for\ r \in [L,R]\)

\(mxp\)\([L,r]\) 中最大元素的位置。

\[\begin{aligned} Q(r)=\sum_{L\le l \le r} mx[l,r] = suf_{r}-suf_{mxp}+(mxp-L+1)a_{mxp} \end{aligned} \]

我们要做的是 \(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\) 可能被盖掉或位于其中的一个部分。以此构造子问题得到递推式。

\[f(n,k)=\sum_{i=1}^{k-2} f(n-i-1,k-i-1)+\sum_{i=k+1}^{n-1} f(i,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\)

posted @ 2024-05-17 10:47  ckain  阅读(30)  评论(0)    收藏  举报