CSAcademy FIICode 2022 1 & 2

我认为 A B 太糖了所以不写

Contest 2.

C

类背包 DP,我们发现,一首歌出现位置的奇偶性一定是不变的,所以我们可以设 \(dp _ {i,j}\) 表示考虑下标奇偶性相同的子序列的前缀 \(j\),放了 \(k\) 种的方案数,转移直接枚举新放一种,即 \(dp _ {i,j} = \sum dp _ {i - a _ k,j - 1}\),最后的答案可以先枚举一个奇偶性的放的歌的总数 \(x\),因为同一奇偶性的歌都可以任意重排,所以要乘个 \(x!(m - x)!\)

D

概期 DP 好题。

我们可以对每条边分别考虑贡献,设这条边为 \(u \to v\),则贡献是 \(\prod _ {x \in \text{Ancestor}(u)} \frac{1}{deg _ x}\),一个点的期望就是其子树中所有边的贡献之和。

考虑修改,对于一个点的修改,这个点的子树中的贡献都不记录了,可以直接乘上 \(0\),对于它的父亲,度数减少了 \(1\),所以需要对整个子树中的贡献乘上 \(\frac{deg _ {fa _ u}}{deg _ {fa _ u} - 1}\),然后使 \(deg _ {fa _ u} \gets deg _ {fa _ u} - 1\)

可以把边 \(u \to v\) 的贡献放到 \(v\) 里面存储,然后就是子树查询加子树修改了,DFS 序套个线段树就行。

Contest 1.

C

神经暴搜。

注意到,给一个数后面加上一个 \(1\),和会增加 \(1\),积不会变,所以这提示我们积与和相等的数肯定很多数位上都是 \(1\),并且非 \(1\) 位的个数一定不会太大,因为 \(\log _ 2 10 ^ {12} \approx 40\),所以我们可以直接搜。

我们需要一些剪枝:

  1. 如果积减去和大于了 \(10 ^ {12}\),就直接退出,因为再怎么加也不能等了
  2. 钦定数字单调递增

然后我们考虑一个每种数位的个数为 \(cnt _ i\) 的数有多少个,我们在 \(n\) 个空位中放入 \(x\) 个数,方案数显然是 \(C _ n ^ x\),然后空位减去 \(x\) 接着记录,最后就是所有贡献的乘积。

把所有贡献记录下来,并记录长度,排序后求一个前缀和,每次二分找到 \(l,r\) 对应的位置然后相减就行。

D

费用流。

去重后,我们对每个原字符串建一个点,放到集合 \(A\) 里面,对每个原字符串的可能前缀去重,然后建个点,放到集合 \(B\) 里。

对于集合 \(A\) 中的点 \(x\),我们从源点连一条容量为 \(1\),费用为 \(num _ x \times \text{len}(x)\) 的边,\(num _ x\) 表示 \(x\) 对应的字符串出现了多少次,\(\text{len}(x)\) 表示 \(x\) 对应字符串的长度。因为每种字符串只能放一次,所以容量为 \(1\),费用是初始长度和,即 \(num _ x \times \text{len}(x)\)

对于集合 \(B\) 中的点,向汇点连容量为 \(1\),费用为 \(0\) 的边。

\(A\) 中的点向 \(B\) 中自己的所有可能前缀连一条容量为 \(1\),费用为 \((\text{len}(y) - \text{len}(x)) \times num _ x\) 的边,相当于从可能前缀中选一个,然后计算贡献。

然后没了,跑个 SSP 完了 \(\text{minCost}\) 就是答案。

E

ACAM DP。

子串匹配明显 ACAM,设 \(dp _ {i,j,u}\) 表示在网格上 \((i,j)\),ACAM 上的结点 \(u\) 的最大价值。

转移枚举下一步的选择:

  • \(r\)\(dp _ {i,j + 1,\delta(u,0)} \gets \max \{ dp _ {i,j + 1,\delta(u,r)},dp _ {i,j,u} + a _ {i,j + 1} + val _ {\delta(u,0)} \}\)
  • \(d\)\(dp _ {i + 1,j,\delta(u,1)} \gets \max \{ dp _ {i + 1,j,\delta(u,d)},dp _ {i,j,u} + a _ {i + 1,j} + val _ {\delta(u,1)} \}\)

最后答案为 \(\max dp _ {n,m,u}\)

posted @ 2025-05-19 21:01  xguagua_233  阅读(21)  评论(0)    收藏  举报