集训8做题记录

建议复习:

  • B 生成函数
  • D 基环树计数
  • I 经典计数 trick

A:AT_abc273_f [ABC273F] Hammer 2

我在上古时期做过的题,区间 dp 模板这一块。

B:AT_abc276_g [ABC276G] Count Sequences

生成函数好题。

初始状态 \(B(x) = 1 + x + x ^ 2 + x ^ 3 + x ^ 4 ...... = \frac{1}{1 - x}\)

转移函数 \(F(x) = x + x ^ 2 +x ^ 4 + x ^ 5 ...... = \frac{x + x ^ 2}{1 - x ^ 3}\)

还有一个前缀和函数,等价于 \(B(x)\)

故 \(ans = \frac{{(x + x ^ 2) ^ {n - 1}}}{(1 - x) ^ 2(1 - x ^ 3) ^ {n - 1}}\)

拆开看,分子直接二项式定理,指数 \(n + i - 1\) 就对应着 \(C^{i}_{n - 1}\) 的系数。

然后就是 \(\frac{1}{(1 - x ^ 3) ^ {n - 1}}\),令 \(G(x) = 1 + x ^ 3 + x ^ 6......\)

发现它是 \(G(x) ^ {n - 1}\),系数都是 \(3\) 的倍数,于是直接球盒问题得到指数为 \(3k\) 时,系数为 \(C^{n - 2}_{k + n - 2}\)

最后是 \(\frac{1}{(1 - x) ^ 2}\),这个直接就是 \(B(x) ^ 2\),容易知道指数为 \(r\) 时系数为 \(r + 1\)

枚举 \(k\),枚举 \(i\),发现过不了但是 \(i\) 可以前缀和优化,就做完了。

C:AT_abc281_g [ABC281G] Farthest City

切了。

发现对于最短路数考虑,先不加入 \(n\),那么 \(n\) 智能连叶子,分层转移就行,设 \(dp_{i , j}\) 表示总共选完 \(i\) 个点然后最后一层 \(j\) 个。

考虑转移,设新的一层有 \(k\) 个点,这一层和上一层随便连至少一条边,新的一层以内随便连,乘上选点的组合数随便转移。

D:AT_abc284_g [ABC284G] Only Once

南非了建议升紫。

\(n\) 个点随便搞基环树,每个点的贡献是向上跳无穷步只经过一次的点的数量。

发现其实就是到环的距离之和。

考虑刻画一种情况,\(u\) 点跳 \(a\) 步到 \(p\),又跳 \(b\) 步再次到 \(p\)

首先这个路径上一共 \(a + b\) 个点,先从 \(n\) 个点里面取出来排好,\(A^{a + b}_{n}\)

然后就是剩下的点乱连即可,答案乘 \(n ^ {n - a - b}\)

所以做完这些其实就确定了唯一的情况,直接算贡献,考虑产生贡献的点有多少?

我们设 \(l = a + b\),贡献其实为 \(a\),但是 \(b\) 不能为 \(0\),所以总和为 \(\frac{l(l - 1)}{2}\)

这几个乘起来就是答案了。

E:AT_abc287_f [ABC287F] Components

专门忽悠人让人以为是二项式反演。

实则是树背包板子。

F:AT_abc288_e [ABC288E] Wish List

宇宙中最水的蓝题,思维黄代码黄加起来就蓝了?

发现按照序列做设 \(dp_{i , j}\) 为前 \(i\) 个物品买了 \(j\) 个。

假设不买这个物品那还说啥了一点变化都没有,买了的话变化为 \(A_i + C_x\)

考虑 \(x\) 的取值范围发现是 \([i , i - j + 1]\),为啥呢?首先你最先买这个不会影响前面的所以 \(x\) 可以取到 \(i\)。

然后你选取买的位置随便选,后面的绝对不会影响前面的,直接记录区间 min,ST 表和区间 dp 都能做。

G:AT_abc290_f [ABC290F] Maximum Diameter

宇宙最水的蓝题下面是宇宙第二水的蓝题。

随便生成树,那么 \(\Sigma d_i = 2n - 2\),考虑方案数,直接插板得到 \(C^{n -1}_{2n - 3}\)。

然后想对于一个确定的 \(d_i\) 序列怎么求最大直径。

考虑了叶子的贡献发现只有 \(1\),那么哪些 \(d_i \ne 1\) 的点呢?

一定会产生贡献,发现可以通过移动来把它移到直径上。

所以对于一个确定的 \(d_i\) 序列答案为不为 \(1\) 的数量 \(+1\)。

我想直接化式子但是太难了失败了,想到每个点本质等价所以拆单点贡献,使用期望 \(\times\) 方案数。

一个点不是 \(1\) 的概率不好求所以求是 \(1\) 的概率,显然为 \(\frac{C^{n - 2}_{2n - 4}}{C^{n - 1}_{2n - 3}}\)

然后用 \(1\) 减去这个方案数乘上 \(n\) 再乘上刚才算的总方案数,别忘了加上总方案数因为叶子有贡献。

最终式子为 \((n + 1)C^{n - 1}_{2n - 3} - nC^{n - 2}_{2n - 4}\)

H:AT_abc292_g [ABC292G] Count Strictly Increasing Sequences

水水水,区间 dp。

发现从前面位往后面位看的话会分成若干个区间,直接出现子问题。

设 \(dp_{i,l,r,c}\) 表示后 \(i\) 位的 \([l , r]\) 区间内最后的数为 \(c\) 的方案数,随便拼起来就做完了。

时间复杂度 \(O(100 \times N^3M)\)

I:AT_abc295_e [ABC295E] Kth Number

好题,没切。

我想的是钦定一个数为第 \(k\) 大,求概率。

发现是 \(O(n ^ 3)\) 量级的,想着化式子,但是做不了,于是看书。

发现是一个经典 trick,太典了但是我忘了,就是分别求这个值 \(x \ge i\) 的概率,sigma 起来。

然后知道这个就随便做了,再枚举有 \(j\) 个 \(\ge x\),随便做了。

切不出来我是区,一定好好复习这个 trick。

J:AT_abc295_f [ABC295F] substr = S

看到题面傻子都知道是数位 dp 了,但是发现和 S 在数里出现了几次有关。

看样例发现 \(22\) 在 \(222\) 里出现了两次,这种是最难的情况,怎么做呢?

因为只能扫过去不能走回头路,这是 \(O(n)\) 的字符串匹配,KMP,直接在数位 dp 里面跳 border 就完事了。

水成啥了。

K:AT_abc299_f [ABC299F] Square Subsequence

发现很容易重,想想怎么让子序列不重,子序列自动机!

但是,用了子序列自动机发现很难处理限制条件了,于是大胆设 dp。

\(dp_{i,j,k}\) 表示一半结尾是 \(i\),另一半开头是 \(k\),结尾是 \(j\) 的方案数。

初状态需要利用子序列自动机的性质,子序列自动机是 DAG,所有字符第一次出现的点引出的路径集合就是所有子序列。

所以我们强制从字符第一次出现的时候开始。

想到这里我发现答案还是重,比如形如 \(abaab\) 的序列,\({1,2,3,5}\) 和 \({1,2,4,5}\) 重复计算了。

于是想到在记 \(ans\) 时抛弃后者,强制 \(nxt_{i,a_k} = k\),直接做到了不重。

这题降蓝吧。

L:AT_abc307_g [ABC307G] Approximate Equalization

读错题!

发现和不变设平均数为 \(s\) 于是只有 \(s\) 和 \(s + 1\),设 \(dp_{i,j}\) 表示考虑前 \(i\) 位有 \(j\) 个 \(s + 1\) 然后 \(n ^ 2\) 转移。

建议降绿。

闲话:我最开始认为是相邻两位变化不得大于 \(1\),怎么想都是 \(n^3\),我是区。

M:AT_abc314_g [ABC314G] Amulets

发现决策护身符给谁不好做,不妨转化一下求打败前 \(K\) 个怪兽需要几个护身符。

贪心决策,发现护身符一定给总伤害高的,所以就是一直取最大直到达到目标值。

想用 set 发现很难低于 \(O(n^2)\),于是一怒之下上线段树 WA 一组发现边界错了改完就过了。

为啥 AT 的青这么水。

N:AT_abc325_g [ABC325G] offence

先想了假 dp,设 \(dp_{i,j}\) 为前 \(i\) 位后缀 \(j\) 个 o,交上去 WA。

发现 ofxofxxx 这组能 hack,应该先删成 ofxx 然后删空,也就是顺序有很大关系不能顺着做。

这种的直接想区间 dp,设 \(dp_{l,r}\) 表示 \([l,r]\) 区间内的最短长度,第一种转移是直接拼,典。

第二种转移是通过删除 \(0\) 个或多个字符来让 o 和 f 相遇,钦定 o 是左端点,然后枚举 f 的位置,判断 o 和 f 中间能否删空。

如果能删空就能转移,它影响后面的就是能删多少删多少,不劣。

做完了。

O:AT_abc328_g [ABC328G] Cut and Reorder

状压神题。

容易发现就是把 \(a\) 的元素往 \(b\) 里填,下标不连续就产生 \(c\) 的额外花费。

设 \(dp_{s,i}\) 表示 \(a\) 数组里用的元素集合为 \(s\) 最后一个元素是 \(i\) 的最小花费。

发现 MLE,一个一个做不好做,考虑一段一段做,转移一下会了,并且认为是 \(O(n^2 2^n)\)。

绞尽脑汁想优化发现根本无法优化,于是绝望看书发现我的做法是正解,复杂度可以分析为 \(O(n 2^n)\)。

为什么呢?考虑枚举区间长度,长度为 \(len\) 的区间有 \(n - len + 1\) 个,会对 \(2^{n - len}\) 个区间有贡献。

所以总转移数为 \(\Sigma2^{n - len}(n - len + 1)\)。

放缩,把 \((n - len + 1)\) 放成 \(n\),提出来变成 \(n\Sigma2^{n - len}\)。

显然为 \(O(n2^n)\) 量级。

posted @ 2026-10-09 14:56  wzc6666  阅读(13)  评论(0)    收藏  举报