校内高质量模拟赛选做

「2020-02-14 省选模拟赛」同桌与室友 (mate)

  • 注意到每个人最多连出两条边,因此形成的图要么是环,要么是链。链分两端颜色是否相同讨论即可。

「2020-02-14 省选模拟赛」传送 (teleport)

  • 有显然的差分约束模型。实际上 dp 可以求出每个点的合法区间,最后若区间非空即有解。

  • 注意到每花费 \(1\) 的代价即可使答案区间左右各扩大 \(1\),因此花费可简单计算。

「2020-02-14 省选模拟赛」生成树 (tree)

  • 将绿边权值设为 \(x\),蓝边权值设为 \(y\),红边权值设为 \(1\),矩阵树定理之后的形式是关于 \(x, y\) 的二元多项式。答案即为系数的二维前缀和,二元插值即可求出。

「2020-02-17 省选模拟赛」序列 (seq)

  • 倒序考虑 \(q\) 的组成。最后加入的数对可以通过分奇偶性区间极值得出。这样可以把原区间分为三个子区间,递归下去即可。子区间的数对必须在当前区间的数对之前选择,这样可以得到数对之间的偏序关系,求字典序最小的拓扑序即可。

「2020-02-17 省选模拟赛」进制 (hex)

  • 第一问,注意到十六进制数的长度不超过 \(15\),预处理每种长度的数在序列中占多少长度可以判断位数。之后通过数位之间的整除、取模即可求得。

  • 第二问,求出第一问后相当于小于某个数的所有数做数位统计,数位 dp 即可。

「2020-02-17 省选模拟赛」矩阵 (matrix)

  • \(f_{i,j}\) 表示有 \(i\)\(j\) 列,其中每行都有涂黑的方案数。

  • \(\text{ans} = \sum \dbinom{n}{i}f_{i,m}\)

  • 考虑两种转移:

    1. 新增一列。\(f_{i,j} \xleftarrow{+} (\dbinom{j}2+j+1)f_{i,j-1}\)

    2. 新增一列,以及若干行。考虑原来某列第一个位置的上一个,和最后位置的下一个位置,和新增的 \(i-k\) 个位置一共形成 \(i-k+2\) 个位置。那么相当于在 \(i+2\) 个位置中选出 \(i-k+2\) 个位置填数。 \(f_{i,j} \xleftarrow{+} \dbinom{i+2}{i-k+2}f_{k,j-1}\)。转移是卷积的形式,NTT 即可。


「2020-02-18 省选模拟赛」小 D 的奶牛 (cows)

  • 先考虑 \(2^n\) 做法。记录每个点连出的点集,状压 dp 每个集合是否可行。
  • 折半搜索。前一半需要统计子集中有多少个合法,可以 FWT;在后半搜索的时候直接求出对应的集合最大能是多少。

[「2020-02-21 省选模拟赛」遗迹探索 (strings) ]

一个串把中间的 SAD 计入答案后,只有前后缀两个字符有用,我们完全可以把信息压缩成:前缀 A 的出现次数,前缀 AD 的出现次数,后缀 S 的出现次数,后缀 SA 的出现次数。如果不存在单独的 A,则贡献是好算,注意一些串可能同时存在匹配的前后缀,要去除用的所有串都是同一类的情况。考虑单独的 A,枚举其被用了几个,把一些长度为 \(1\) 的前/后缀拼成长度为 \(2\) 的前/后缀即可

「2020-02-21 省选模拟赛」基因进化 (reverse)

对于可翻转前缀 \([1,i]\),我们能从其最优答案推出下个可翻转前缀 \([1,j]\) 的最优答案。直接维护这个最优答案,需要支持头插入、尾插入、翻转字符串,使用 hash 二分判断字典序,双端队列维护 hash 值。

「2020-02-21 省选模拟赛」城市破坏 (disconnected)

  • 如何判断删去若干边之后,图能否被分成两个连通块?

  • 每条边随机一个权值,点权为相邻的边的边权的异或和,满足所有点权为 \(0\)。若删去的边的边权异或和为 \(0\),则被分成两个连通块;否则不是。

  • \(2^c\) 枚举删掉的边集,若异或和为 \(0\) 则不连通。

  • 关于边权,dfs 树上,非树边随机,树边构造即可。


「2020-02-25 省选模拟赛」小 B 的班级 (class)

如果人的位置确定,点 \(u\) 的父边最多能为 \(\min(siz_u, n-siz_u)\) 个点对产生贡献,并且显然可以取到上界。那么对所有方案计数只需分别枚举子树内男、女人数即可,直接做是 \(O(nm^2)\) 的。实际上只需要枚举子树内总人数即可。

[「2020-02-25 省选模拟赛」小 B 的环 (loop)]

倍长断环成链,如果相邻字符相同则这两个位置不会同时出现,这样就把字符串分割成若干段独立子串。删除长度为 \(k\) 的串,等价于保留长度为 \(n-k\) 的串;存在合法的长度为 \(k\) 的串,等价于 \(\exist i,s_{i} \ne s_{i+k-1}\),显然补集转化,不存在合法的长度为 \(k\) 的串,等价于 \(\forall i,s_{i} = s_{i+k-1}\),即存在长度为 \(len-k+1\) 的 border。求串的所有 border,kmp 即可。

[「2020-02-25 省选模拟赛」小 B 的农场 (farm) ]

分治,求所有跨过中线的答案。以竖中线为例,枚举上边界,线段树维护每个下边界的答案,则中线两边显然分别考虑,且可选长度自上而下构成一个逐渐“缩紧”的形状,用单调栈维护。注意边界。

注意到答案大等于 \(2\max(W,H)+2\),所以只需要横着竖着各分治一次即可。


[「2020-02-28 省选模拟赛」小 B 的棋盘 (chess)]

无穷解当且仅当 \(k\ge n\),比较显然。否则前 \(k+1\) 个点与后 \(k+1\) 个点至少存在一对匹配点,否则无法增加 \(k\) 个点使对称。枚举匹配点对,即可求出对称中心,暴力判断是否存在匹配点即可。可以排序后双指针优化常数。

[「2020-02-28 省选模拟赛」小 B 的夏令营 (camp)]

等价于相邻两行剩余区间有交。暴力 dp,设 \(f_{i,l,r}\) 表示考虑前 \(i\) 行,第 \(i\) 行剩余区间为 \([l,r]\) 的方案数,转移枚举上一行所有有交的区间,再乘上剩下 \([l,r]\) 的概率。需要优化状态。设 \(g_{i,j} = \sum \limits_{k\le j} f_{i,k,j}\),发现 \(f\) 的转移方程可以用 \(g\) 表示,然后再求一个前缀和即可得到 \(g\) 的转移式,可以前缀和优化。

「2020-02-28 省选模拟赛」小 B 的图 (graph)

把询问离线下来排序。当 \(x\) 很充分小时,我们优先选用 \(k+x\) 的边;随着 \(x\) 增大,我们会选择把一些边替换成 \(k-x\) 的边。但是两种边使用的集合是不变的——一定是各自子图上最小生成树边。所以先求出 \(k+x\) 边的最小生成树,枚举每一条 \(k-x\) 边,维护路径上边权最大值,可以求出替换时的 \(x\) 值。注意到如果两条 \(k-x\) 边对应路径有交集,那么一定是 \(k\) 小的先替换,并且不会再被替换。所以替换后要在最小生成树上删除,边权赋成负无穷。LCT 维护最小生成树即可。


「2020-03-31 省选模拟赛」积性函数求和 (sum)

算法 1

\(f(p^k) = 2k+1\),Min25 筛板子题。

算法 2

口胡的。

\(f(n) = \sum \limits_{d|n} \sum\limits_{p|n}[(p,d)=1] = \sum\limits_{t|n} \mu(t)\sigma_{0}^2(\dfrac{n}t)\)

\(\sum\limits_{i=1}^n f(i) = \sum\limits_{i=1}^n \sum\limits_{t|i} \mu(t)\sigma_{0}^2(\dfrac{i}t) = \sum\limits_{d=1}^n \mu(d) \sum\limits_{i=1}^{n/d}\sigma_{0}^2(i)\)

如果可以使用杜教筛求出 \(\sigma_0^2\) 的前缀和,那么由于我们只需要其在形如 \(\lfloor\dfrac{n}{x}\rfloor\) 处的前缀和,一遍杜教筛即可解决问题。感觉很对。

算法 3

搬运官方题解。

\(f(n) = \prod\limits_{i=1}^{k}(2\alpha_i+1) = \sum\limits_{S\subseteq\{1,2,3\dots ,k\}} 2^{|S|}\prod\limits_{i\in S} \alpha_i = \sum\limits_{d|n}2^{\omega({d})} = \sum\limits_{d|n}\sum\limits_{p|d}\mu^2(p)\)

所以

\[f = \mu^2 * I* I = \mu^2 * \sigma_{0} \]

带回原式

\[\sum \limits_{i=1}^n f(i) = \sum \limits_{i=1}^n\mu^2(i)\sum\limits_{j=1}^{n/i}\sigma_0(j) \]

有两个比较经典的结论

\[\sum\limits_{i=1}^n \mu^2(i) = \sum\limits_{i=1}^{\sqrt n}\mu(i) \lfloor\dfrac{n}{i^2}\rfloor \]

\[\sum\limits_{i=1}^n \sigma_0(i) = \sum\limits_{i=1}^n \lfloor\dfrac{n}{i}\rfloor \]

\(\sum \mu^2\)\(\sum \sigma_0\) 的前缀和都可以在不超过 \(O(\sqrt n)\) 的时间复杂度内求出。因此可以预处理前 \(\sqrt n\) 个值,剩下的暴力做,复杂度分析和杜教筛是一样的。

「2020-03-31 省选模拟赛」游戏 (game)

先手必胜:对手存在一张牌,使得其比先手所有牌都小。

后手必胜:对于自己的每一张牌,都有一张先手的牌比它小。

剩下都是平局。

「2020-03-31 省选模拟赛」子串排列 (permutation)

把询问结点定位到后缀树上,建出虚树贪心。维护每个子树的答案,把所有子结点的答案按照字典序排序后加入,最后再加入当前子树根的串。排序直接暴力排(在这里想了挺久),重儿子长度不会计入,复杂度是对的。

posted @ 2021-09-02 19:43  Aphrosia  阅读(100)  评论(0编辑  收藏  举报