10月份模拟赛总结
2024.10.3:
能够感受到出题人深深的恶意,扔了道 zak 没场切的交互,甚至 2e5 的输出关同步流被卡了。
A:
一共只有 $ 25 n $ 种本质不同的操作,不妨求出每种操作后的新串的平方子串个数,最后取其中最大值即可。 跨过它们的平方子串(包括修改后新生成的)的贡献。
记 $ L=\min (L C S(a, b) ,len ), R=\min (L C P(a+1, b+1) ,len -1 ) $ ,贡献为 $ \max (0, L+R-k+1) $ 。
至于有修改的情况,不妨先考虑每种修改对 $ L, R $ 分别造成了什么影响。下以 $ R $ 为例说明,设修改了第 $ i $ 个点:
$ i \in[1, a]: R $ 保持不变;
$ i \in[a+1, a+R], R $ 变为 $ i-(a+1) $ 。
$ i=a+R+1 $ :若将 $ s_{a+R+1} $ 修改为 $ s_{b+R+1} , R $ 变为 $ R+1+L C P(a+R+2, b+R+2) $ ;否则,仍为 $ R $ 。
$ \max (0, L+R-k+1) $ 取哪一边,可以得到更细致的分类,每一类中的贡献都是一个关于 $ i $ 的一次函数。
于是只要对贡献数组做 $ O(1) $ 次区间加一次函数,差分即可。
B:
官解:
考虑三角剖分的对偶图 (去掉外部无限大的面对应的那个点) ,可以发现该对偶图构成一棵树。
并且,若以原图中边 $ (1, n) $ 所在的三角形为树的根,则其是一棵有根二叉树。
我们不妨将其视为一棵二叉搜索树。
在此建模中,可以发现,题面中的一次操作对二叉树形态的影响,相当于二叉树中的一次左旋/右旋操作。
同时,注意到点 $ x $ 为题面中的"关键点",等价于二叉树的根的左子树大小为 $ x-2 $ 。
于是,若要使 $ x $ 成为关键点,只要将中序遍历中第 $ x-1 $ 个点通过旋转操作转到根即可。
这可以使用 splay 做到均摊 $ O((n+m) \log n) $ 次旋转操作。
C:
考虑一个长为 $ n-1 $ 的排列插入 $ n $ ,有 $ n $ 种方式,且其对逆序对数的影响恰分别为 $ +0,+1,+2, \ldots,+(n-1) $ 。
使用生成函数,得到长为 $ n $ ,逆序对数为 $ m $ 的排列数为:
由于 $ m \leq n $ ,所以 \(\prod_{i=1}^{n}\left(1-x^{i}\right) \equiv \prod_{i=1}^{\infty}\left(1-x^{i}\right)\left(\bmod x^{m+1}\right)\) 。
考虑五边形数定理(这辈子没想到会用这个):
于是答案转化为 $ \left[x^{m}\right] \frac{F(x)}{(1-x)^{n}} $ 。
由于 $ F $ 在前 $ m $ 项中只有 $ O(\sqrt{m}) $ 项是非 0 的,可以做到 $ O(\sqrt{m}) $ 求解单次询问的答案,总时间复杂度 $ O(n+T \sqrt{m}) $ 。
2024.10.5:
A:
任意染色的总方案是 $ m^{n} $ ,但存在本质相同的方案。考虑怎样的染色会等致本质相同,首先需要找到点的对应关系使原图同构。
因为原图为基环树,为了使对应后每条边仍合法,可知若环上点不与自己对应,只可能是将原图绕环旋些后新图与原图满足同构,考虑怎样求出最小旋转距离。
设环上总点数为 $ l e n $ 。为满足旋转后环上每点连出的树同构,先对每棵树进行树hash。
对于 hash值相等的所有树,找出它们在环上的间距,若间距均相等 (设为 $ d $ ) 则原图每旋转 $ d $ 这些树就会同构,若间距不等就只有旋转 len (即转回原图) 后这些树才会同构。
求出不同 hash值所需的旋转长度的 lcm,即可得到整个图的最小旋转距离(设为 D)。
现在已知所有合法的点的对应倩况,考虑统计染色方案。已知使图能同构的最小旋转距离 $ D $ ,可将环上每 $ D $ 个点及连出树归为一部分,共 $ T=l e n / D $ 部分。
每部分内的染色不会相互影响,只需算出该部分内所有树的不同构染色方案数相乘就得到每一部分的染色方案,可在树hash 同时用组合数求得。因为每部分都互相同构,染色方案都相同,设为 $ f $ 。
考虑用容斥计算最终本质不同的方案数,若每部分染色方案均不同,则答案应为 $ \frac{f^{T}}{T} $ ,因为每种本质相同的染色方案都在 $ f^{T} $ 中算入了 $ T $ 次。
但因存在一些部分染色方案相同,可能导致这种本质相同的染色方案并没有没算够 $ T $ 次。
若染色方案由长为 $ K $ 的循环串重复 $ T / K $ 次后得到,则 $ f^{T} $ 中它只被计入了 $ K $ 次。
从大到小枚举 $ T $ 的因数 $ K $ ,考虑将当前钦定偱环串长为 $ K $ 的本质相同染色方案补至 $ T $ 次,钦定循环串长为 $ K $ 的染色方案即为 $ f^{K} $ 。
在之前枚举的 $ K $ 的倍数 $ t K $ 时,每次染色都会令其出现 $ K $次,因此只需用 $ \frac{T}{K} $ 减去所有 $ t K $ 的系数 $ a[t K] $ 之和即可得到当前的 $ f^{K} $ 的系数 $ a[K] $ 。
将所有 $ f^{K} $ 系数算出来后相乘相加最后除 $ T $ 就得到本质不同的染色方案。
B:
建 SAM,用总的本质不同字符串对数减去存在包含关系的。
不妨枚举大串,计算为其子串的不同个数,为了避免算重,在大串第一次出现位置统计答案。
一个字符串所有子串第一次出现位置可以用插入每个前缀的 $ l e n_{p}-l e n_{f a_{p}} $ 刻画,即 $ s_{1 \ldots p}, s_{2 \ldots p}, \ldots, s_{l e n_{p}}-l e n_{f a p} \ldots p $ ,左端点为一段前缀。
设 $ l=l e n_{p}-l e n_{f a_{p}} $ ,最后一次左端点出现在 $ l $ 之后的字符串显然可以和这 $ l $ 个字符串配对,否则可以和左端点位置个配对,注意减去重复的。
问题变为计算 $ [l+1, p] $ 的本质不同子串个数以及 $ [1, l] $ 的本质不同子串个数的左端点之和,二者本质相同。对 parent tree 上每个点维护上一次被标记的最右端点,每次更新 $ s[i \ldots p] $ 的所有右端点等价于把 $ p $ 到根路径上区间赋值,显然可以把一条链上相同的标记一起考虑做一次区间加,这等价于 LCT 中 access 操作,直接上 LCT 即可。
随便用什么东西维护左端点的信息就完事了。
C:
先考虑 $ L \in[l, r], R=r $ ,即询问区间的所有后缀的贡献。
模拟一个左端点 $ L=r $ ,然后往前移动的过程,过程中维护最大值,并贡献答案。
对于每个点,找出其左边第一个大于它的点,这样的关系构成了树,并且上述过程中最大值的变化过程构成了一条向上的链。
记 $ [L, R] $ 最大值为 $ s_{p} $ ,则这条链从 $ R $ 开始,到 $ p $ 结束,发现链上的点,除了 $ p $ 之外的点的贡献是可以预处理的,点 $ x $ 的贡献为 $ s_{x} \times\left(x-f a_{x}\right) $ 。
于是可以预处理树上前缀和之后再差分,对于 $ p $ 的贡献单独处理, $ L \in[l, r], R=r $ 的部分贡献为 $ \operatorname{sum}{R}-\operatorname{sum}+s_{p} \times(p-L+1) $ 。
发现对于 $ L \in[l, r], R=r $ 的部分,贡献只与最大值处有关。仔细思考一下,在解决一个 $ [L, R] $ 的问题时,也可以视作只关注了最大值处,所以理论上,解决单个区间的复杂度与解决后缀区间的复杂度是几乎一致的。
于是只需要求出区间最大值的位置,就可以 $ O(1) $ 计算答案了。
2024.10.7:
A:
考虑用 'rxxx' 填充矩阵,可以将位置 2 和 4 替换为 y,这样除了边上的 y 都可以提供 3 的贡献,共 \(38\times19\times3=2166\),算上边上的共 \(2166+19\times3=2223\),优先填 3,最后用 1 补齐即可。
B:
考虑二分答案 mid,我们只关注学生能否使得被抓人数 $ \leq $ mid。
那么,所有人数 $ \leq m i d $ 的实验室就无关紧要了,只关心人数为 $ a>m i d $ 的实验室,设同学有 $ p $ 的概率进入这个实验室,那么如果老师选择进入这个实验室,期望抓到的人数就是 $ (1-p) \times a_{\text {。 }} $
所以我们要求对于任意这样的 $ a_{i} $ ,都有 $ \left(1-p_{i}\right) \times a_{i} \leq m i d $ ,据此可以求出每个 $ p_{i} $ 的下界,全加起来看看到不到 1即可。
C:
?
D:
诶呦是原。
2024.10.8:
A:
设 $ d p_{i, j, k} $ 表示序列 $ a $ 的前 $ i $ 个数,最大值为 $ j $ ,并且前 $ i $ 个数里有 $ k $ 个 $ j $ 的合法方案数,那么 $ d p_{i, j, k} $ 可以转移到 $ d p_{i+1, j, k}, d p_{i+1, j, k+1}, d p_{i+1, x, 1}(x>j) $ 。
容易发现 $ k \leq b_{j} $ ,所以状态总数是 $ O\left(n^{2}\right) $ 级别的,加上前缀和可以做到 $ O\left(n^{2}\right) $ 。
B:
将式子转化一下:
这是一个关于 $ y $ 的二次函数,开口向下,所以最大值决策在 $ \frac{x}{\left[\frac{2}{y}\right] \times 2} $ 的前驱后继之中,整除分块使得 $ \left\lfloor\frac{x}{y}\right\rfloor $ 为定值后查询区间前驱后继,可以做到预处理后 $ O(1) $ 查询。
容易发现这个东西可以线段树维护,复杂度为 $ n \sqrt{n} \log n $ ,可以通过 $ n \leq 10^{5} $ 的部分分。
因为我们有 $ O(n) $ 次修改, $ O(n \sqrt{n}) $ 次查询,所以我们希望均摊后能做到 $ O(\sqrt{n}) $ 修改, $ O(1) $ 查询。考虑对值域分块,维护每一个值块内的前驱后继,散块可以直接查询,整块可以暴力查询,因为整除分块之后得到的区间是不交的,所以一个整块只会被暴力查询一次,复杂度是 $ O(n \sqrt{n}) $ 。
C:
将斐波那契转化为通项公式形式:
令 $ A=\frac{1}{\sqrt{5}}, B=-\frac{1}{\sqrt{5}}, x=\frac{1+\sqrt{5}}{2}, y=\frac{1-\sqrt{5}}{2} $ ,那么有
这是一个普通幂的形式,跟组合数的下降幂不太搭,观察到 $ k $ 比较小,考虑使用斯特林数把下降幂转化成普通幂:
于是
最后一个 $ \sum $ 里面的东西使用等比数列求和即可。
但是发现 5 在模 $ 10^{9}+7 $ 意义下并没有二次剩余,所以需要手写一个。
时间复杂度 $ O\left(k^{2} \log \right) $ 。
D:
改牛魔。
哦,弱化版 链接。