做题记录 25.4.12

\(\textcolor{purple}\odot\) CF1922F Replace on Segment

出现次数最少的数字的出现次数一定不超过 \(\lfloor\frac nx\rfloor\),通过 \(\lfloor\frac nx\rfloor+1\) 步就可以全部变为这种值,因此答案上限为 \(\lfloor\frac nx\rfloor+1\)

\(eq_{l,o,v}\) 表示经过不超过 \(o\) 次操作令区间内值都变成 \(v\),左端点为 \(l\) 时右端点的最大值,\(ne_{l,o,v}\) 表示区间内值都不等于 \(v\) 的最大右端点

转移有两种,一种为把 \(o\) 次操作拆分为 \(l+r=o\),先用 \(l\) 次操作处理一段,接下来部分尽量用 \(r\) 次操作覆盖;另一种为考虑最后一次操作,可以令区间中数都 \(ne v\),也可以令区间中 \(\ne v\) 的全部变成 \(=v\) 的,操作后需要尝试扩展右端点(区间后面可能接了一段 \(\ne v\)\(=v\) 的,可以把这部分纳入区间)

时间复杂度 \(O(\sum \frac{n^3}x)\)

代码

参考

\(\textcolor{purple}\odot\) CF1919E Counting Prefixes

\(p\) 分为 \(>0\)\(=0\)\(<0\) 三段,对于 \(>0\)\(<0\) 的部分分别求出 \(f_{i,0/1}\)\(g_{i,0/1}\),表示所有 \(>0\)\(p\)\(<0\)\(p\) 填为 \(i\) 个连续段,且其中是否含有包含位置 \(n\) 的连续段,该情况下的方案数

两者计算方式相似,以 \(f\) 为例

\(dp_{i,j,0/1}\) 表示填充了 \(\ge i\)\(p\),形成 \(j\) 个连续段,是否含有第 \(n\) 个位置 的方案数,则 \(f_{i,0/1}=dp_{1,i,0/1}\)

考虑如何计算 \(dp\)

\(c_i\) 表示 \(>0\)\(p\)\(i\) 的数量,\(mx\) 表示最大的 \(p\)

\(mx\le 0\),则 \(dp_{1,0,0}=1\),其余为 \(0\)

否则 \(dp_{mx,c_{mx},0/1}=1\)

\(dp_{i+1,j,0}\) 的转移为

\[dp_{i,cnt_i-j,0/1}\gets dp_{i+1,j,0}\binom{cnt_i-1}{j} \]

即其中 \(j\)\(i\) 都贴在某个 \(i+1\) 右侧,同时合并若干段,剩下 \(cnt_i-j\)\(i\) 每个贴在一个新连续段的左侧,总计 \(cnt_i-j\) 段,方案数相当于 \(cnt_i\)\(i\) 依次排列,共 \(cnt_i-1\) 个空隙,选择 \(j\) 个插入之前的连续段,共 \(\binom{cnt_i-1}j\) 种选择

\(dp_{i+1,j,1}\) 的转移为

\[dp_{i,cnt_i-j+1,1}\gets dp_{i+1,j,1}\binom{cnt_i-1}{j-1} \]

与上一种类似

发现 \(dp\) 中非 \(0\) 的位置只有 \(O(n)\) 个,用 unordered_map 保存有用位置即可把计算 \(f\)\(g\) 的时间复杂度降到 \(O(n)\)

\(c_0\)\(0\) 的数量加一(前缀和 \(0\) 位置的一个 \(0\)

枚举 \(\le i\le c_0\) 表示 \(>0\) 的段数量,则答案为

\[\sum_{i=0}^{c_0}\left(\binom{c_0-1}{i-1}f_{i,1}g_{c_0-i,0}+\binom{c_0-1}{i}f_{i,0}g_{c_0-i,1}+\binom{c_0-1}{i}f_{i,0}g_{c_0-i-1,0}\right) \]

时间复杂度 \(O(\sum n)\),常数极大

代码

参考

\(\textcolor{blue}\odot\) CF1918F Caterpillar on a Tree

先令 \(k\gets k+1\),然后强制要求回到根,显然这样处理答案不变

显然由叶子回到根最优

\(k=0\) 则答案 \(=2(n-1)\),然后考虑 \(k\ne 0\) 的情况

\(dep_u\) 表示 \(u\) 到根的距离,\(d_u\) 表示 \(u\) 子树内最大的 \(dep\)\(p_u\) 表示 \(d_u\) 对应的点

对于 \(x\),若要在其子树内选择一个叶子回到根,使得其最后被遍历,且遍历它之后需要回到 \(fa_x\),显然选择 \(p_x\),若不使用传送门,要从 \(p_x\)\(fa_x\) 需要 \(dep_{p_x}-dep_{fa_x}=d_x-dep_x+1\) 步,若使用传送门则用 \(dep_{fa_x}=dep_x-1\) 步,即使用传送门可节约 \(d_x-2dep_x+2\)

选择 \(d_x-2dep_x+2\)\(k\) 大的 \(p_x\) 即可(注意不能重复选)

时间复杂度 \(O(n\log n)\)

代码

参考

posted @ 2025-04-13 08:19  Hstry  阅读(3)  评论(0)    收藏  举报