ARC180C做题笔记

luogu题面
AT题面

题目大意

给定长度为 \(n\) 的数列 \(\{a_i\}\),选择一个子数列 \(\{b_i\}\),然后将 \(\{b_i\}\) 替换为 \(\{b_i\}\) 的前缀和,然后放回原数列中。

问经过这样一次操作后,会产生多少本质不同的新数列。

解析

这种对某个对象进行操作,并对产生的新对象计数的问题,一般可以考虑如下两个方面:

  • 从操作过程入手,考察操作过程的性质,或者考察哪些操作过程会产生相同的结果,从而进行容斥/去重/转化的目的
  • 从操作结果入手,考察什么样的操作结果的合法性,对操作结果做计数 DP 或者组合数计算等。

这题就是第一类做法的一道好题。
考察不同的子序列选法对答案的影响,不妨考虑两个不同的选法 \(a\)\(b\) 导出了相同的数列,考察 \(a\)\(b\) 中第一次出现的分歧,不妨设第 \(i\) 项出现在 \(a\) 中而没有出现在 \(b\) 中,因此为了保证第 \(i\) 相同,则有 \(\sum_{j=1}^{i-1}a_j=0\)(那么自然有 \(\sum_{j=1}^{i-1}b_j=0\))。

考虑第 \(i\) 项对后面的影响,不难注意到当 \(a_i=0\) 时,\(a\) 多出来的这一项没有任何影响,否则必须有 \(b_i\) 等于 \(a_i\) ,不然导出的数列就不相等。

当然,如果 \(a\)\(b\) 后面都没有再选数,那么就没有要求了。

由此得出了结论,可以做如下钦定:(设选中的子数列 \(\{b_k\}\)

  • 对于所有选中的数 \(b_i=x\),如果它不是 \(0\),并且 \(\sum_{j=1}^{i-1}b_i=0\),则必有 \(b_{i-1}~b_i-1\) 中没有 \(x\),这是因为根据上面的结论,如果前面有 \(x\),则把选中的数替换为前面的 \(x\),导出的数列不变
  • 对于所有选中的数 \(b_i=0\),如果 \(\sum_{j=1}^{i-1}b_i=0\),则它不能选(这是因为选和不选一样)。
  • \(b\) 数列长度是 \(k\),则有 \(\sum_{i=1}^{k-1}b_i\) 不为 \(0\),这是因为如果是 \(0\),则最后一项选或不选一个样。

再做出了上述三条额外钦定之后,不难证明符合原题条件和上述三个条件的选择方案和导出的数列一一对应。(读者自证不难)

然后就可以套上 DP 板子了。

总结

计数好题,最难的不在于计数(实际上就是平凡的 DP),而在于通过性质的观察将问题转化为易于计数的形式。本题中导出的数列相等这一约束十分强大,因此实际上容易找出导出相同数列的两个选择方案之间的联系。(为什么我写的总结风格这么像《奥数教程》)

posted @ 2025-02-28 19:11  yanzihe  阅读(15)  评论(0)    收藏  举报