2026 多校 杂题选记

吃到大份了.

牛客多校 3 I

发现相邻交换和包含 1,n1, n 的交换的 Δ\Delta 形式复杂,所以先将形如 (1,i),(i,n),(i,i+1)(1, i), (i, n), (i, i + 1) 的交换贡献到答案上.然后考虑 1<j<i<n1 < j < i < nij>1i - j > 1 的交换 (i,j)(i, j) 的贡献.

考察交换后序列价值和原序列价值的差 Δ\Delta.记 li=ai1,ri=ai+1,oi=liai+riail_i = a_{i - 1}, r_i = a_{i + 1}, o_i = |l_i - a_i| + |r_i - a_i|,有

Δ=liaj+riaj+ljai+rjaioioj\Delta = |l_i - a_j| + |r_i - a_j| + |l_j - a_i| + |r_j - a_i| - o_i - o_j

考虑枚举绝对值的符号,有

Δ=maxs1,s2,s3,s4{1,1}[s1(liaj)+s2(riaj)+s3(ljai)+s4(rjai)oioj]\Delta = \max_{s_1, s_2, s_3, s_4 \in \{-1, 1\}} [s_1(l_i - a_j) + s_2(r_i - a_j) + s_3(l_j - a_i) + s_4(r_j - a_i) - o_i - o_j]

分离 iijj,有

Δ=maxs1,s2,s3,s4{1,1}[(s1li+s2ris3ais4aioi)+(s3lj+s4rjs1ajs2ajoj)]\Delta = \max_{s_1, s_2, s_3, s_4 \in \{-1, 1\}} [(s_1 l_i + s_2 r_i - s_3 a_i - s_4 a_i - o_i) + (s_3 l_j + s_4 r_j - s_1 a_j - s_2 a_j - o_j)]

先枚举 ii,考虑如何计算最大的 Δ\Delta.有

Δmax=max1<j<i1{maxs1,s2,s3,s4{1,1}[(s1li+s2ris3ais4aioi)+(s3lj+s4rjs1ajs2ajoj)]}=maxs1,s2,s3,s4{1,1}{max1<j<i1[(s1li+s2ris3ais4aioi)+(s3lj+s4rjs1ajs2ajoj)]}=maxs1,s2,s3,s4{1,1}[(s1li+s2ris3ais4aioi)+max1<j<i1(s3lj+s4rjs1ajs2ajoj)]\begin{aligned} \Delta_{\mathrm{max}} &= \max_{1 < j < i - 1} \{\max_{s_1, s_2, s_3, s_4 \in \{-1, 1\}} [(s_1 l_i + s_2 r_i - s_3 a_i - s_4 a_i - o_i) + (s_3 l_j + s_4 r_j - s_1 a_j - s_2 a_j - o_j)]\} \\ &= \max_{s_1, s_2, s_3, s_4 \in \{-1, 1\}} \{\max_{1 < j < i - 1} [(s_1 l_i + s_2 r_i - s_3 a_i - s_4 a_i - o_i) + (s_3 l_j + s_4 r_j - s_1 a_j - s_2 a_j - o_j)]\} \\ &= \max_{s_1, s_2, s_3, s_4 \in \{-1, 1\}} [(s_1 l_i + s_2 r_i - s_3 a_i - s_4 a_i - o_i) + \max_{1 < j < i - 1} (s_3 l_j + s_4 r_j - s_1 a_j - s_2 a_j - o_j)] \end{aligned}

枚举 s1,s2,s3,s4s_1, s_2, s_3, s_4 的所有可能取值,对每个取值预处理第二项即可快速计算.

牛客多校 3 J

我操我真想不到这个.

考察如何确定一个点 uu 的父亲.若 uu 没有任何被要求的祖先,直接连到 11 上显然是最优的.考察 uu 的祖先约束集合 ancu\mathrm{anc}_u,一个简单的想法是直接连到 arg maxvancudepv\argmax_{v \in \mathrm{anc}_u} \mathrm{dep}_v 上.不妨设该策略选择的点为 pup_u,若存在 ww 满足 uancwu \in \mathrm{anc}_w,且存在 xancw,x∉ancu,deppu<depx<depux \in \mathrm{anc}_w, x \not \in \mathrm{anc}_u, \mathrm{dep}_{p_u} < \mathrm{dep}_x < \mathrm{dep}_u,问题就出现了:uu 的父亲至少应该是 xx,不然 ww 的祖先约束无法被全部满足.

这启发我们按照深度降序确定节点在新树中的父亲.对于叶子节点 uu,此问题不存在,直接选择 ancu\mathrm{anc}_u 中深度最深的点 vv.选择后,为使 uu 的其他祖先约束被满足,这些点必须成为 vv 的祖先,即将 ancu\mathrm{anc}_u 中除 vv 外的点加入 ancv\mathrm{anc}_v.写一个启发式合并堆模拟该过程即可.

牛客多校 3 B

若存在局面满足条件,显然在所有局面中中奖的次数是一定的,这确定了每个局面的概率,我们只需要计算局面数.

n+kc=mn + kc = m,其中 kk 为中奖次数.若不存在这样的 kk 显然答案为 00.考虑喝一次饮料对剩余钱数的影响,若未中奖会使钱数加上 1-1,中奖了会使钱数加上 c1c - 1.我们可以将一个局面看作长度为 mm 个整数序列,其中有 kk 个元素是 c1c - 1,剩余 mkm - k 个元素是 1-1.局面合法等价于序列的所有真前缀的和均大于 n-n

对这样的序列计数,这在形式上像一个 Raney 引理 能够解决的问题,考虑构造双射使得其变成引理能处理的形式.由于序列的和为 n-n,所有真前缀的和均大于 n-n 等价于所有真后缀的和均小于 00.将序列取反并翻转,等价于序列和为 nn 且所有前缀和大于 00.由引理,任意由 kk1c1 - cmkm - k11 组成的序列,有 nn 个循环移位合法.而考虑任意合法的序列,会被其所有循环位移各计算一次.故答案为 nm(mk)\frac{n}{m} \binom{m}{k}

牛客多校 3 M

tt 为树根.记 fuf_uuu 的父亲,dud_uuu 的度数,inu\mathrm{in}_uuusstt 的路径上则为 11,否则为 00

UuU_u 为操作 ufuu \rightarrow f_u 期望执行的次数,DuD_ufuuf_u \rightarrow u 期望执行的次数,观察游走路径可以发现,Uu=Du+inuU_u = D_u + \mathrm{in}_u.记 vvuu 的一个儿子,容易列出方程组:

Uu=1du1vUv+[u=s]duDv=1du1(Du+vvUv)+[u=s]du\begin{align} U_u &= \frac{1}{d_u - 1} \sum_v U_v + \frac{[u = s]}{d_u} \\ D_v &= \frac{1}{d_u - 1} \left(D_u + \sum_{v^\prime \not= v} U_{v^\prime}\right) + \frac{[u = s]}{d_u} \end{align}

(1)(1) 式可得:

vUv=(du1)Uudu1du[u=s]\sum_v U_v = (d_u - 1) U_u - \frac{d_u - 1}{d_u} [u = s]

代入 (2)(2) 式有:

Dv=1du1(DuUv+vUv)+[u=s]du=1du1(DuUv+(du1)Uudu1du[u=s])+[u=s]duDv+1du1Uv=1du1Du+Uu[u=s]du+[u=s]dududu1Dv=1du1Du+Uu1du1invDv=1du(Du+(du1)Uuinv)\begin{aligned} D_v &= \frac{1}{d_u - 1} \left(D_u - U_v + \sum_{v^\prime} U_{v^\prime}\right) + \frac{[u = s]}{d_u} \\ &= \frac{1}{d_u - 1} \left(D_u - U_v + (d_u - 1) U_u - \frac{d_u - 1}{d_u} [u = s]\right) + \frac{[u = s]}{d_u} \\ D_v + \frac{1}{d_u - 1}U_v &= \frac{1}{d_u - 1} D_u + U_u - \frac{[u = s]}{d_u} + \frac{[u = s]}{d_u} \\ \frac{d_u}{d_u - 1}D_v &= \frac{1}{d_u - 1} D_u + U_u - \frac{1}{d_u - 1} \mathrm{in}_v \\ D_v &= \frac{1}{d_u} \left(D_u + (d_u - 1) U_u - \mathrm{in}_v\right) \end{aligned}

又有 Uv=Dv+invU_v = D_v + \mathrm{in}_v.对于 tt 的所有儿子 rr,令 Ur=inrU_r = \mathrm{in}_r,自上而下转移即可.答案为 Uu+Du\sum U_u + D_u

牛客多校 4 C

fSf_S 为考察包含 SS 内测试点的所有评测序列,能得到的最小用时.转移考虑插入某个不在 SS 中的测试点 pp.记 TiT_i 为第 ii 个程序不能通过的测试点集合,代价是:

i=1n[TiS=]di,p=TiSdi,p\sum_{i = 1}^n [T_i \cap S = \varnothing] d_{i, p} = \sum_{T_i \subset \overline{S}} d_{i, p}

对每个测试点 pp 和每个集合 SS 预处理这个求和,枚举测试点后即为计算子集和.利用高维前缀和技巧可做到 O(m22m)O(m^2 2^m)

牛客多校 4 E

考虑不修改怎么做,容易发现答案的分母肯定只由 11 条边构成,预处理全源最短路 disu,v\mathrm{dis}_{u, v} 后可枚举边查询答案.

由于修改只会把边改小,设修改的边是 (x,y,w)(x, y, w),对于 uvu \rightarrow v 的最短路,讨论其是否经过修改的边,新图中最短路为 min{disu,v,disu,x+w+disy,v}\min\{\mathrm{dis}_{u, v}, \mathrm{dis}_{u, x} + w + \mathrm{dis}_{y, v}\}.每次询问枚举边计算即可.注意判定枚举到的边是修改的边的情况.

牛客多校 4 H

考虑不修改的时候何时字典序最小,这其实是经典结论:我们定义字符串 aa 小于 bb,当且仅当 a+ba + b 的字典序小于 b+ab + a.容易发现这是一个全序关系,我们将输入串按这个序排序,顺序拼接即为最优.很可惜我不会证这个.

对于任意确定的拼接方式和修改次数 kk,最优的修改方案肯定是将前 kk 个非 a\texttt{a} 字符修改成 a\texttt{a}.因此,考察输入的每一个字符串,它在最终的方案中可能有三种状态:被修改为全 a\texttt{a} 字符串,有一个前缀被修改成全 a\texttt{a} 字符串,保留原样.其中只可能有一个字符串属于第二种状态.

若我们已经确认了那些字符串被修改,剩余的字符串只能按上文定义的顺序拼接作为后缀.故我们先把输入的字符串按上文定义的顺序排序,顺序考虑当前字符串以何种状态进入答案.设 fi,j,0/1=(a,s)f_{i, j, 0 / 1} = (a, s) 为考虑了前 ii 个字符串,执行了 jj 次修改,有没有字符串属于第二种状态,能做到的最长前缀 a\texttt{a} 的个数为 aa,字典序最小的后缀为 ss

考虑如何进行转移.先考虑当前字符串以第二种状态出现在答案中的情况.设当前字符串为 ss,枚举作为全 a\texttt{a} 前缀的前缀长度 kk,所需要的修改次数是 cost=pk[si,pa]\mathrm{cost} = \sum_{p \le k} [s_{i, p} \not= \texttt{a}].记 fi1,j,0=(a,t)f_{i - 1, j, 0} = (a, t)substr(s,k+1)\operatorname{substr}(s, k + 1)ssk+1k + 1 开始的后缀.有转移:

fi,j+cost,1(a+k,substr(s,k+1)+t)f_{i, j + \mathrm{cost}, 1} \leftarrow (a + k, \operatorname{substr}(s, k + 1) + t)

再考虑作为第一类状态时.设当前字符串为 ss,所需的修改次数 cost=p[si,pa]\mathrm{cost} = \sum_p [s_{i, p} \not= \texttt{a}].记 fi1,j,k=(a,t)f_{i - 1, j, k} = (a, t),有:

fi,j+cost,k(a+s,t)f_{i, j + \mathrm{cost}, k} \leftarrow (a + |s|, t)

最后考虑作为第三种状态,后缀的字典序最小性由排序保证.记 fi1,j,k=(a,t)f_{i - 1, j, k} = (a, t),有:

fi,j,k(a,s+t)f_{i, j, k} \leftarrow (a, s + t)

牛客多校 4 J

考察任意操作序列的“搜索树”.这里的搜索树这样构造:压栈操作在当前节点下新挂一个儿子,弹栈操作将当前节点修改成当前节点的父亲,和常规意义上的搜索树的不同之处在于允许点重复出现.

不难发现任意一个操作序列唯一对应一个“搜索树”,而该操作序列的答案就是搜索树的最大深度.题目要求“按顺序访问所有所有特殊点”,说的其实是题目定义的访问记录构成的序列存在子序列是 xx.我们记选定的子序列中的 xix_i 在搜索树中对应的点为 access(xi)\mathrm{access}(x_i),考察 xix_ixi+1x_{i + 1} 间只能走最短路的限制,等价于约束 access(xi)\mathrm{access}(x_i)access(xi+1)\mathrm{access}(x_{i + 1}) 的点之间的路径对应原图两点间的某条最短路.考虑 access(xi)\mathrm{access}(x_i)access(xi+1)\mathrm{access}(x_{i + 1}) 的 lca,它肯定要在 xix_ixi+1x_{i + 1} 的最短路上,若我们约束了这一点,只需要保证 access(xi)\mathrm{access}(x_i)access(xi+1)\mathrm{access}(x_{i + 1}) 到 lca 路径上的最后一个点走的是最短路,即删除 lca 后,两点到他们所在联通块的根走的是最短路.而考察这两个联通块内的所有点,若它是某个 access(xk)\mathrm{access}(x_k),这些 kk 构成连续区间.这样我们就找到了子问题的结构.

fu,l,rf_{u, l, r} 为从 uu 开始,按顺序访问 xlxrx_l \sim x_r,构成的搜索树的最小最大深度.为了保证搜索树合法,并能和其他区间拼接,我们需保证 uuxlx_lxrx_ruu 走的是最短路.但是对于 r=Lr = L 的情况,由于到达序列末尾,不再需要和其他区间拼接,xrx_ruu 走的是最短路这一条件需要移除.

先考虑 uu 作为区间内某个 xkx_kxk+1x_{k + 1} 的路径的 lca 时的转移,此时 uu 需在 xkx_kxk+1x_{k + 1} 的某条最短路上.有转移:

fu,l,rmax{fu,l,k,fu,k+1,r}f_{u, l, r} \leftarrow \max\{f_{u, l, k}, f_{u, k + 1, r}\}

再考虑在当前联通块的根上挂一条祖先链,或者说连续执行弹栈操作导致的转移.假设从 fv,l,rf_{v, l, r} 转移到 fu,l,rf_{u, l, r},我们需要保证 uuxlx_l 的最短路经过 vv,并且若 rLr \not= L,需保证 xrx_ruu 的最短路经过 vv.满足条件就有转移:

fu,l,rfv,l,r+disu,vf_{u, l, r} \leftarrow f_{v, l, r} + \mathrm{dis}_{u, v}

其中 disu,v\mathrm{dis}_{u, v}uuvv 的最短路经过的边数.

由于我们计算的都是边深度,最终答案为 fx1,2,L+1f_{x_1, 2, L} + 1.注意将 xx 中连续的点缩在一起,并判定序列长度为 11 的情况.

牛客多校 4 K

考察一条边 (u,v)(u, v) 如何将两个连通块的点分树合并.首先,合并后点分树的根可以在原本 uu 所在连通块的根和 vv 所在连通块的根中随便选一个.我们不妨选择 uu 所在连通块点分树的根.选择后,我们发现连接 (u,v)(u, v) 只会对 uu 所在子树的形态造成影响,其他子树形态不变.考虑 uu 所在子树,问题形式一致.所以合并的总方案数就是将 uu 到其所在连通块点分树的根和 vv 到根这两条链合并,保证两条链内顺序的方案数.这个显然只和 uuvv 的深度有关.

所以设 fu,if_{u, i} 为考察 uu 子树这一连通块,使得 uu 深度为 jj 的点分树方案数.考虑将 uu 到根链上这 ii 个点分配,显然有一个是 uu.考虑如何分配剩下 i1i - 1 个,设 uu 的儿子 vv 所在子树分得 svs_v 个,有 vsv=i1\sum_v s_v = i - 1.又若 vv 所在子树能分 kk 个,vv 在点分树中的深度至少是 kk,方案数为 dkfv,d\sum_{d \ge k} f_{v, d},记这个为 sufv,k\mathrm{suf}_{v, k}.有转移:

fu,i=s(i1s1,s2,)vsufv,svf_{u, i} = \sum_s \binom{i - 1}{s_1, s_2, \cdots} \prod_v \mathrm{suf}_{v, s_v}

预处理后缀和后树形背包合并即可.

牛客多校 6 A

pip_i 从大到小考虑每个位置 ii.对于当前位置 ii,它只能够借助已经考虑过的位置执行交换操作.那么我们将已经考虑过的点两侧连接起来,ii 可达的位置就是当前它所处的连通块大小减去连通块中已经考虑过的点的个数.若我们按 pip_i 从小到大操作,则这些位置均能对方案数造成贡献.用并查集维护这个过程即可.

牛客多校 7 A

首先发现若我们决定操作某位,我们可以将序列中所有元素的该位任意赋值.从高到低按位考虑答案,考虑何时该位必须被操作.我们钦定该位不操作,并允许操作比其低的所有位,如果仍无法得到不降序列,则该位是必须的.

问题转化为给定允许操作的位集,判定能否得到不降序列.顺序考虑序列中的元素,尝试计算当前能够得到最小的前缀最大值(即前缀中的最后一个元素),先将允许操作的位集全部置 11,若仍不能比之前得到的前缀最大值大,则无法得到递增序列;否则从高到低尝试将允许操作的位集中的位置 00