退役前的做题记录 Ⅱ
退役前的做题记录 Ⅱ
被群友发现是照着 zsy 的题单刷的了 /kel
https://www.cnblogs.com/zhoushuyu/p/10492689.html
我什么时候变成日更博主了 /kk
#2712. 「BalkanOI 2018 Day1」Minmaxtree
比较 naive 的题,不难得到一条边的上下界,那么这条边的边权选上下界一定更优,所以就是一个裸的二分图匹配了,得到上下界可以使用并查集优化下。
CF1142D Foreigner
非常牛逼啊。
发现这样一件事,对于一个好数 x,由它产生的好数 y,我们可以通过 \(y \bmod 10\) 和 \(x \bmod 11\) 推知 \(y \bmod 11\),这样就可按 \(\bmod 11\) 建出自动机了。
具体来说,设 \(x\) 排名 u,y 排名 v,有这样的关系:
在自动机上 dp 即可。
6338. 「SDWC2018 Day2」优秀
\(\Theta(n^5)\) 能在 300 ms 内过 \(n = 100\) 是我妹想到的。
设 \(dp[i][j][k][t]\) 表示前 i 种数放了 j 个,在排列上有 k 个需要插入的位置,排列的方案数是 t 的总方案数。
事实上这就是一个 \(\mathsf{dp \ of \ dp}\),大力转移,我们放 \(p(p \ge k)\) 个 \(i+1\) 来插入,新的排列需要插入的位置个数就是 \(p - k\) 个,并且方案数就是相当于一个箱子放球问题,用隔板法即可。
方案数那维非常容易不合法,也许是这题可以 \(\Theta(n^5)\) 过的原因。
3069. 「2019 集训队互测 Day 1」整点计数
考虑枚举 dis,那么就是这题 圆上的整点
答案就是 \(\sum_{i=1}^Nf(i)^k\),有经典结论设 \(\chi(n)=\begin{cases}1& n\bmod 4=1\\-1 &n \bmod 4=3\\0 & \text{Ohterwise}\end{cases}\) 那么答案就是 \(4\sum_{d|i^2}\chi(d)\)
容易发现 \(\chi\) 是一个积性函数,\(f\) 并不积性,但是 \(\frac f4\) 是积性函数,设 \(g(x)=\frac{f(x)}4\),\(g(x)\) 在质数上的点值为 \(g(p^c) = \begin{cases}(2c+1)^k & p \bmod 4 = 1\\1 & p \bmod 4 = 3\end{cases}\),接下来就是用 \(\mathbf{min25}\) 解决积性函数求和的问题了。
UOJ426 [集训队作业2018]石像
G 是一个积性函数可以使用传统筛法筛出来,其在 \(p^c\) 的点值是:
F 可以使用拉格朗日插值。
为什么是多项式?我们可以枚举所有点一共有多少个不同的值,颜色个数为 k 的方案个数是固定的系数,然后从 m 里面选出来 k 种颜色,这个是关于 m 的 k 次多项式。
如何算出颜色个数为 k 的方案呢,我们可以按拓扑序进行转移,然后进行二项式反演即可(如果开两个数组滚动应该也行)。拓扑序可以用 tarjan 缩点的时候顺便求。
CF1063F String Journey
我观察到了如下性质:
- 答案是 \(\Theta(\sqrt n)\) 级别的。
- 最后一个串是一个字母,然后每次只会在前端或后端加入一个字母。
应用第一个性质可以得到 \(\Theta(n\sqrt n)\) 的哈希表做法。
应用第二个性质可以得到 \(\Theta(n\log n)\) 的后缀自动机做法,具体来说:
将串翻转,设 \(dp_i\) 表示以 i 结尾的最大长度是多少,贪心可得不需要考虑长度更小的串。比较厉害的是观察到 \(dp_{i+1}-1\le dp_i\),所以得到了 \(dp_{i+1}\) 的范围,我们可以暴力扫,势能分析一下复杂度是对的,如何 check 一个答案是后缀自动机模板题。
3114. 「SDOI2019」移动金币
知道结论后就比较简单了,发现这就是一个阶梯博弈,结论是:奇数堆石子异或和为 0 必败,否则获胜。
那么我们枚举奇数堆石子总和,剩下部分使用组合数分配,设 \(dp[n][bit]\) 表示石子的最高位小于等于 bit,总和等于 n 先手必败的方案数,暴力枚举转移即可,时间复杂度 \(\Theta(nm \log n)\)。
PE444
直接不好做,我们需要考虑每个人的决策。
轮到 x 时,他知道已经翻开而且没有走的数字集合 \(P\) 和没有出现的数字集合 \(S\)
如果 \(\min S > \max P\),直接翻开自己即可。否则我们证明一定拿走 \(\max P\):
如果 \(\max P > \max S\),显然直接拿走 P 最优,否则我们有可能拿到比 \(\max P\) 小的,这是不优的,我们拿到比 $\max P $ 大的,后面一定会被换走,结局还是不优的 >_<。被换走可以归纳证明。
通过手玩发现,留下来的数(不是人)一定是后缀最小值,证明也比较好证。
这个东西的期望是 \(\ln n\) 的,可以考虑算每个位置的贡献,\(E(p)=\sum_{i=1}^n\frac 1i=\ln n+\gamma+\frac 1{2n}\)
python 算一算即可。
P7111 青春有悔
首先总方案数是好求的,先考虑无修改的情况:
不如改求失败的概率:
\(\ln,\exp\) 再卷一下,单次就可以做到 \(\Theta(n \log n)\) 了。
假设我们算出来这个东西 \(G(x)\),每次相当于要求 \([x^t]\frac{1-x^{c}}{1-x^{a}}G(x)\),不难发现单次可以 \(\Theta(n)\)。
进一步发现求的是 \([x^t]\frac{G(x)}{1-x^a}-[x^{t-c}]\frac{G(x)}{1-x^a}\),\([x^t]\frac{G(x)}{1-x^a}=\sum_{i=0}^{t}[i \equiv t\bmod a][x^i]G(x)\)。
经典问题,根号分治即可。
3115.「SDOI2019」连续子序列
讲道理以前没见过这个序列,这里有一些性质:http://www.matrix67.com/blog/archives/5822
这个序列可以由集合 \(\{0\}\) 以这样的方式形成:当前集合大小为 \(2^k\),将集合中每个 0 替换成 01,1 替换成 10,形成新的 \(2^{k+1}\) 大小集合。
对应的就可以缩回去,可以证明对于长度大于 3 的字符串有唯一的方法缩:否则就会出现 00 / 11 被划分到一块的情况。
这样就可以大力记忆化了。
3102. 「JSOI2019」神经网络
现在二合一题越来越多了。
我们可以比较简单的 dp 出将一棵树划分成 k 条链的方案数,注意长度大于 1 的链有两个方向。
第二问是有 T 个颜色,每种颜色有若干有标号小球,将小球排成一个环,任何两个相邻小球颜色不同的方案数。
考虑容斥,如果是一个序列,那么对于一种颜色生成函数大概是:
考虑环上的情况,我们强制第一种颜色的一号点所在的链放在第一个位置,第一个颜色的 EGF 为:
小问题是第一个颜色可能和最后一个颜色相同,我们减去不合法的情况,这时第一个颜色 EGF 为:
然后暴力卷积即可。
3051. 「十二省联考 2019」皮配
十二省联考有 3 道 dp 题 😮
容易设究极暴力 dp,\(f[N][0/1][Ya][Za][R][r]\),稍微优化一下发现 r 这维没有用,加上滚动数组可以获得 40 pt。
接下来我们仔细分析一下,每个导师没有有自己的人数限制,而是和别人一共的人数限制,思考一下发现就是有两堆数 \(\{c_0,c_1\},\{d_0,d_1\}\),从第一堆里选一个数,再从第二堆里选一个数,都减去自己的权值。如果 \(k = 0\),那么两堆就是完全独立的,我们可以先 dp 出第一部分,然后再 dp 出第二部分合并即可,这样就可以拿到 \(70pt\) 了。
否则我们把有限制的人拿出来单独 dp 然后最后合并即可。
2435. 「ZJOI2018」迷宫
感觉整个人都自动机了:保龄自动机。
这题本质是求 m 进制 \(k\) 倍数识别自动机的最小节点数。
有一个平凡构造,建立 k 个点,点 i 向 \(i \times m + r \quad(r \in [0,m-1])\) 连边,不难发现这样是正确的。
由奇怪定理可知所有 DFA 最简化都是一样的,所以我们试图对这个自动机进行简化。
暴力算法跑不过的,因为这题有优美的性质。
考虑两个节点 \(u, v\) 本质相同当且仅当对于任意串 \(s\),从 \(u\) 开始,匹配 \(s\) 到了终止节点,那么 \(v\) 开始也会到终止节点,不难发现第一个条件,两个节点到达终止节点的最短串大小相同,设其为 t,对于一个串,从 \(u\) 节点开始走,最终会到 \(u\times m^{l+1}+a_l\times m^{l}+\cdots a_0 \bmod k\) 号节点,发现只要 \(u \times m^{l+1}\equiv v\times m^{l+1}\bmod k\) 即可,那么当 \(l+1=\text{最短串长度}\) 时限制最严格,有了这两个限制,我们可以进行模拟了。
3042. 「ZJOI2019」麻将
又是一道自动机题:胡牌自动机。
我们将期望转化为摸了 k 张牌,不获胜的概率是多少。
如果给定一种状态,我们可以用 dp 来判断其是否胡牌,具体而言:\(dp[0/1][j][k]\) 表示是否摸了对子,i - 1 处开始的顺子个数为 j,i 处开始的顺子个数为 k 时最多可以摸几张面子,cnt 表示最多可以配出一个对子,一个未胡状态就对应着这 18 个 dp 数组的值再加上一个 cnt,看起来很大,但实际上很稀疏,经过搜索,我们发现只有 2000+ 个状态,这样就可以快乐 dp 了,转移时用组合数,注意在值域上从前向后 dp 而不是随机加入一张牌。
当然也可以使用 DFA 最小化算法进一步缩小 DFA 大小,但这里没有必要。