退役前的做题记录 Ⅱ

退役前的做题记录 Ⅱ

被群友发现是照着 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,有这样的关系:

\[\Large v=9+55\lfloor\frac u{11}\rfloor +(0+1+\cdots (u \bmod 11)-1)+(x \bmod 10) + 1\\ \Large v \bmod 11=10+\frac {(u \bmod 11)(u \bmod 11 - 1)}{2}+(x \bmod 10)\\ \]

在自动机上 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]石像

\[\Large \sum_{a_1=1}^m\sum_{a_2=1}^m\cdots\sum_{a_n=1}^m \sigma_0^3(\gcd(\prod a_i)^3)\prod [a_{x_j}\le a_{y_j}]\\ \Large =\sum_{d=1}^{m}\sigma_0^3(d^3)\sum_{a_1=1}^{\frac md}\sum_{a_2=1}\cdots\sum_{a_n=1} \sum_{k|a_1,k|a_2\cdots}\mu(k)\prod [a_{x_j}\le a_{y_j}]\\ \Large =\sum_{T=1}^m\left(\sum_{d|T}\sigma_0^3(d^3)\mu(\frac Td)\right)\sum_{a_1=1}^{\frac mT}\sum_{a_2=1}\cdots\sum_{a_n=1}\prod [a_{x_j}\le a_{y_j}]\\ \Large =\sum_{T=1}^mG(T)F(\left\lfloor\frac mT \right\rfloor)\\ \]

G 是一个积性函数可以使用传统筛法筛出来,其在 \(p^c\) 的点值是:

\[\Large G(p^c)=\sigma_0^3(p^{3c})-\sigma_0^3(p^{3c-3})\\ \Large G(p^c)=(3c+1)^3-(3c-2)^3=81c^2-27c+9\\ \]

F 可以使用拉格朗日插值。

为什么是多项式?我们可以枚举所有点一共有多少个不同的值,颜色个数为 k 的方案个数是固定的系数,然后从 m 里面选出来 k 种颜色,这个是关于 m 的 k 次多项式。

如何算出颜色个数为 k 的方案呢,我们可以按拓扑序进行转移,然后进行二项式反演即可(如果开两个数组滚动应该也行)。拓扑序可以用 tarjan 缩点的时候顺便求。

CF1063F String Journey

我观察到了如下性质:

  1. 答案是 \(\Theta(\sqrt n)\) 级别的。
  2. 最后一个串是一个字母,然后每次只会在前端或后端加入一个字母。

应用第一个性质可以得到 \(\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}\)

\[\Large S_0 = \sum \sum_{j\le i}\frac 1jx^i\\ \Large S_0 = \frac{-\ln(1-x)}{1-x}\\ \Large S_k = \frac{-\ln(1-x)}{(1-x)^{k+1}}\\ \Large S_k' = \left(\frac{-\ln(1-x)}{(1-x)^{k+1}}\right)'\\ \Large =\frac 1{(1-x)^{k+2}}-(k+1)\frac{\ln(1-x)}{(1-x)^{k+2}}\\ \Large =\frac 1{(1-x)^{k+2}}+(k+1)S_{k+1}\\ \Large [x^n](k+1)S_{k+1}=[x^{n+1}](n+1)S_{k}-\binom{n+k+1}{k+1} \]

python 算一算即可。

P7111 青春有悔

首先总方案数是好求的,先考虑无修改的情况:

\[\Large \sum_{i\ge L}[x^i]\prod\frac{1-x^{a_i+1}}{1-x}\\ \Large =\sum_{i\ge L}[x^i]\frac{1}{(1-x)^n}\prod1-x^{a_i+1}\\ \]

不如改求失败的概率:

\[\Large \sum_{i< L}[x^i]\frac{1}{(1-x)^n}\prod(1-x^{a_i+1})\\ \Large =[x^{L-1}]\frac{1}{(1-x)^{n+1}}\prod(1-x^{a_i+1})\\ \]

\(\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 个颜色,每种颜色有若干有标号小球,将小球排成一个环,任何两个相邻小球颜色不同的方案数。

考虑容斥,如果是一个序列,那么对于一种颜色生成函数大概是:

\[\Large \sum f_i i!\sum_{j \le i}(-1)^{i-j}{i - 1\choose i - j}\frac{x^j}{j!} \]

考虑环上的情况,我们强制第一种颜色的一号点所在的链放在第一个位置,第一个颜色的 EGF 为:

\[\Large \sum f_i(i-1)!\sum_{j \le i}(-1)^{i-j}{i - 1\choose i - j}\frac{x^{j-1}}{(j-1)!}\\ \]

小问题是第一个颜色可能和最后一个颜色相同,我们减去不合法的情况,这时第一个颜色 EGF 为:

\[\Large \sum_{i>1} f_i(i-1)!\sum_{j \le i}(-1)^{i-j}{i - 1\choose i - j}\frac{x^{j-2}}{(j-2)!} \]

然后暴力卷积即可。

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 大小,但这里没有必要。

posted @ 2021-03-11 17:08  Hs-black  阅读(610)  评论(5编辑  收藏  举报