一类 dp 计数题没做
CF2125E Sets of Complementary Sums
考虑到集合 \(Q\) 没啥特殊性质,考虑对 \(a\) 计数。
首先发现重复元素存在的意义就是让 \(Q\) 内元素全体加该元素的值,那么我们将这个重复的元素替换成元素值个 1,就转化成了除了 1 以外其他数都只出现一次的情况。
我们再将 \(a\) 进一步简化,发现若 \(Q\) 的最小值为 \(c\),那么让 \(a\) 全体减 \(c-1\) 再加上 \((n-1)(c-1)\) 个 1 即可,这样每个元素减少了 \(c-1\) 且 \(s\) 也减少了 \(c-1\),那么 \(Q\) 不变,转化成了至少一个 1 和若干个其他不重复的元素。
那对这个序列计数会算错吗?首先肯定不会算漏,其次若存在两个 \(a\) 生成的 \(Q\) 相同,那么首先由于 \(\max Q=s-1\),所以两者 \(s\) 相等,再因 \(Q\) 次大值为 \(s-a 的次小值\) 那么两者的次小值也相等(最小值必须是 1 所以必然相等),以此类推两者完全相同,所以不会算重。
对 \(a\) 计数就简单多了。由于 \(\max Q=s-1\le x\),那么 \(s\le x+1\),由于 \(a\) 没有重复元素(先钦定 1 只出现一次然后之后随便加就行),所以 \(a\) 的长度是 \(O(\sqrt x)\) 级别的。类似拆分数的,设 \(f_{i,j}\) 表示 \(len=i,s=j\),转移可以先全体加 1 再添一个 1,也可以只全体加 1。为了钦定最小值是 1,我们可以保留最后一次全体加 1 再添 1 的步骤,用 dp 算前面的步骤就行。转移 \(f_{i,j}=f_{i-1,j-i}+f_{i,j-i}\),答案是 \(\sum_{x'\le x+1-n} (x-x'-n+2)f_{n-1,x'}\)。
时间复杂度 \(O(x\sqrt x)\)。
AGC027E ABBreviate
首先要解决一个判定问题,一个串 \(s\) 能否变成一个串 \(t\)?进一步弱化这个问题,一个串是否能变成一个字母 \(c\)?(只考虑 \(\lvert s\rvert>1\))
假设 \(c=\) a,将 a 视作 1,b 视作 2,那么操作相当于 22->1 或 11->2,观察可得总和模 3 意义下值不变。那么有一个必要条件是 \(\sum s_i\equiv 1\pmod 3\),不充分是因为 \(s=\) 121 时无法变成 a 但总和模 3 为 1。发现这个例子不对是因为初始无法操作,考虑再加上“存在两个相邻的位置值相等”的条件,归纳可得条件充要。
考虑计数,那么我们只需要将 \(s\) 划分成若干个段然后将这些段都变成一个字母即可,但显然这样会算重。为了避免算重,我们钦定贪心的选择每个字符对应的段,即选择长度较小的,简单 dp 一下即可,复杂度 \(O(n)\)。
AT_dwacon6th_prelims_e Span Covering
这题我都不会???还打什么 OI????
(声明:\(X\rightarrow m,L_i\rightarrow a_i\))一看就不是很能做,考虑一种排列 dp 常用的套路,换到这个题上,就是我不直接钦定每个线段覆盖在哪,只关心他们之间是否连成一个连续段。不难发现把 \(a_i\) 降序排序后由于前面的线段长度都比该线段长,所以每次加入只会单独拎出来一个连通块、和其他连通块合并、被某个连通块包含、合并两个相邻的连通块,这样就不需要考虑什么一次性包含三个连通块之类的麻烦状态了。
自然地设 \(f_{i,j,k}\) 为前 \(i\) 个线段形成 \(j\) 个连通块,线段长度并为 \(k\),状态转移:
- 单独一个连通块:\((j+1)f_{i,j,k}\rightarrow f_{i+1,j+1,k+a_i}\)
- 和其他连通块合并:\(2j\cdot f_{i,j,k}\rightarrow f_{i+1,j,k+l}(0<l\le a_i)\)
- 被某个连通块包含:\((k-j(a_i-1))f_{i,j,k}\rightarrow f_{i+1,j,k}\)
- 合并两个相邻的连通块:\((j-1)(a_i-l+1)f_{i,j,k}\rightarrow f_{i+1,j-1,k+l}(0<l\le a_i,j\ge 2)\)
- 注意要及时排除掉 \(k+j-1\le m\) 的状态。
暴力转移显然是 \(O(n^2m^2)\) 的,前缀和优化虽然可以做到 \(O(n^2m)\)。但这太不优美了。
考虑到因为第 \(i\) 轮每个连通块长度必然 \(\ge a_i\),所以 \(j\le \frac{m}{a_i}\),而转移的复杂度又是 \(O(a_i)\) 的,所以上述暴力 dp 实际复杂度 \(O(nm^2)\)。
AGC052C Nondivisible Prefix Sums
还是先考虑怎么判定一个序列是否合法。首先一个显然的必要条件是总和不为 \(P\) 的倍数,但这显然并不充要。
我们考虑贪心的去填,首先优先填出现次数最多的数,如果该数不合法那就填出现次数次多的数,然后再填出现次数最多的数。这个做法显然会在出现次数最多的数不合法且只有此数能填的时候会倒闭。我们由此还能提出一个充分条件:不存在出现次数满足 \(c>n-c+1\) 的数(称之为绝对众数,注意定义和原本的绝对众数不一样)。但这显然并不必要。
继续找条件。假设存在绝对众数,并不失一般性地假设其为 1(否则全局乘上绝对众数的逆元,这并不改变结果合法性)。仍然考虑贪心地填,考虑极端情况(设不是绝对众数的数分别为 \(b_1,b_2,\cdots,b_m\)),也就是
考虑到 1 的数量少一点的话照这么填下去直到 1 不再是绝对众数为止,此时显然不存在绝对众数,那么一定有解。由于是极端情况,所以 1 更多必然无解。所以又得出了一个充分条件:\(n-m>(m+1)P-1-\sum_{1\le i\le m} b_i\)。感性理解发现综合上述所有条件的条件是充要的。
整理一下无解的充要条件:
- 总和模 \(P\) 为 0。
- 再不满足第一个条件下的情况下,存在绝对众数且 \(n-m>P-1+\sum_{1\le i\le m}P-b_i\)。
对着这条件计数即可。由于要满足第二个条件的 \(P\) 是 \(O(n)\) 级别,设 \(f_{i,j}\) 表示 \(i\) 个数 \(\sum P-b_i=j\) 的方案数,显然可以前缀和优化,复杂度 \(O(n^2)\)。
AGC028D Chords
感觉可能也是简单题(?)
首先肯定考虑拆贡献,令 \((i,j)\) 为 \(i,j\) 两点所属连通块的左、右端点,并且让 \([i,j]\) 内部封闭起来(也就是没有边外连),然后让 \([i,j]\) 外面乱填,设 \(f_{i,j}\) 为只考虑 \([i,j]\) 内部形成若干个连通块且 \(i,j\) 所属一个连通块的方案数。直接做一看就不太可做,考虑容斥,先判掉有往外连的情况,然后枚举 \(i\) 实际所属的连通块的右端点 \(k\),令 \(F(x)\) 为 \(x\) 个点随便连的方案数,显然是双阶乘,则有转移 \(f_{i,j}=F(c_{i,j})-\sum_{i\le k<j}f_{i,k}F(c_{k+1,j})\)。时间复杂度 \(O(n^3)\)。

浙公网安备 33010602011771号