2024 暑期模拟赛 #8

数数题。数数题。数数题。


2024暑期CSP-S&NOIP模拟赛第8套

链接:link
题解:暂无

时间:4h (2025.10.28 14:00~18:00)
题目数:4
难度:

A B C D
\(\color{#F39C11} 橙\) \(\color{#FFC116} 黄\) \(\color{#52C41A} 绿\) \(\color{#BFBFBF} ?\)
*1000 *1400 *1600 *?

估分:100 + [0,20] + 80+ 0 = [180,200]
得分:100 + 0 + 80 + 0 = 180
Rank:2/6


场祭

读题。

怎么三个数数题 /jk,要寄

A 签。

B 一眼容斥,然后就没有然后了,发现怎么容斥都是只过小样例。1h 拼尽全力无法战胜,然后写了个 \(O(n^2)\) 的反演还是错的,最后就只写了个暴力了,然后发现似乎加个记忆化就可以跑到起飞,于是打了个 \(200\) 的表,结果一测还是之过小样例,哦哦忘了考虑在胡乱填字符的时候填到 SOS 的情况了,加上之后……还是过不了。

不管了扔掉了。浪费了太多时间了。

开 C,\(c=1\) 的特殊性质是容易的,单步容斥即可,然后想了下正解,发现答案是这个:

\[\prod _{i=1} ^n (a_i + b_i) - \sum _{|S| < c} \left( \prod _{i \in S} a_i \prod _{i \notin S} b_i \right) \]

想到这里就打算扔掉了,毕竟看起来不是任何可反演的形式,但是等等……注意到后面可以等价于在 \(n\) 个数中选若干个,所以可以考虑一个 dp 令 \(f_{i,j}\) 为前 \(i\) 个数选 \(j\) 个的答案,带修之后就是一个 DDP 然后直接上线段树即可。

但是分析一下发现复杂度达到了恐怖的 \(O(qc^2 \log n)\),大样例跑了 11s,加点优化变成了 3.4s,不过这个大样例强度很弱啊,那应该是卡不过去了。

D 怎么一点暴力分不给 /fn


补题

B 怎么是 dp。关键是你长得太像容斥了啊喂!

补 C,学习到了新科技:退背包。

例题是洛谷 P4141。题意是 \(n\) 个物品 \(a_i\),背包最大容积 \(m\),求 \(\forall i \in [1,n] , j \in [1,m]\),删掉 \(a_i\) 这个物品后,选择一些物品使其体积之和为 \(j\) 的方案数。要求复杂度 \(O(nm)\)

思路:考虑在暴力做背包的时候,有转移 \(f_j \gets f_{j-a_i}\),而由于是背包,所以 \(a_i\)枚举顺序是不影响答案的,于是在删掉一个 \(a_i\) 的时候,可以直接把背包删掉一个元素,变成 \(f_j \gets - f_{j-a_i}\),就可以得到删掉 \(a_i\) 的答案了。

注意正常背包的枚举顺序是 rpe(j,m,0),退背包的枚举顺序应为 rep(j,0,m)

于是这个题也是一样的,对上面那个 dp 做退背包即可,一次退背包复杂度是 \(O(c)\) 的。

然后退背包式子的推导就是根据背包来推的,令考虑 \(i\) 前的 dp 数组为 \(f\),考虑 \(i\) 后的为 \(f’\),则背包的式子为:

\[f'_j = b_i \times f_j + a_i \times f_{j-1} \]

从这个式子出发反推回去,把 \(f_j\) 单独放一边,就可以得到退背包的式子:

\[f_j = \frac {f'_j - a_i \times f_{j-1}} {b_i} \]

这也是为什么要和背包枚举顺序相反的原因,只有这样才能在求 \(f_j\) 的时候保证 \(f_{j-1}\) 是删掉 \(i\) 后的 dp 值。


天依宝宝可爱!

posted @ 2025-10-28 20:42  little__bug  阅读(79)  评论(0)    收藏  举报