集训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)\) 量级。

浙公网安备 33010602011771号