【题解】牛客挑战赛48
谢罪谢罪谢罪
A, B 题的题面都出现了一些小错误,C 题题面出现了一点歧义,谢罪(
C 题题面的 其实是笔误,但是确实不影响答案。
非常庆幸的是数据并没有锅,尽管 G 题最后其实没有人验题。
A
考虑直接预处理出 的答案。设 表示前 个数中的最大值, 表示前 个数中的次大值。
一开始时令 。
我们考虑分类讨论 :
-
若 ,那么令 。
-
若 ,那么令 。
-
若 ,那么令 。
询问时输出 即可。
出题人题解:
【天使果冻题解】
解法1:用一个multiset<int>s维护前缀里有哪些数,那么s.end()指针往前两位则是次大值。
复杂度O(nlogn)解法2:用两个变量分别维护最大值和次大值,在遍历的过程中更新这两个变量即可。
复杂度O(n)
B
事实上,不难发现要想最后 都出现,当栈顶为 时只能入栈 或 。
证明不难,考虑到如果入栈了 ,其中 ,那么此后将不再有可能入栈 。
另一方面,注意到栈内的状态是不重要的,我们只关心栈顶,设它为 那么同时只需要保证 都在栈中即可。
这时我们的 DP 方程已经呼之欲出了。
根据套路,考虑倒序 DP,设 表示当前栈顶为 ,停止时栈中包含 的概率。
考虑入栈的是 还是 ,则易得
移一下项,可以得到
或 DP 即可,其中 。
C
注意到给 个点连 条边,若连通则必然是树。且最少连接 条边才能使它们连通。
所以容易发现这张图相当于构造一片 个结点 棵树的森林。
证明可以考虑反正,如果有一个连通块大小为 ,但连接了超过 条边,那么必然会有另一个大小为 的连通块连接不到 条边,从而推出矛盾。
我们注意到,给一棵无根树赋上其点数的贡献,组合意义上可以看做选定一个根(事实上这正对应了组合结构符号化中的 Pointing 构造)。
从而答案就转化为了 个点 棵有根树的森林个数。
考虑构造一个虚根 ,强制其度数为 。问题就变成了钦定根且根有度数限制的有标号树个数。
根据 Prufer 序列相关结论,若 的度数为 ,则 在 Prufer 序列中出现的次数为 。
因此首先考虑从长度为 的 Prufer 序列中选出 个位置为 (这等于 ),然后令剩下的 个位置在 中任意选择。根据乘法原理,将两步的结果结合起来,即为
我们知道 ,下降幂可以 计算,逆元也可以 算出,加上一个快速幂计算 ,总时间复杂度为 。
D
首先使用 Floyd 预处理出全源最短路。设 表示 到 的最短路长度。
为了计算出牛奶结点,我们考虑计算 表示 。
这个可以简单地 算出,当然结合一些位运算也可以做到 。
然后我们需要计算出 表示 的权值。这个比较简单,此处不再赘述。
然后考虑最后一步 DP,设 表示目前划分出的集合的并为 时所有方案的权值之和。
列出转移式,会得到一个子集卷积的形式。考虑通常处理子集卷积的过程,由于我们以集合大小为阶段,所以可以同时处理这样的半在线卷积。
E
基础比较扎实的同学应该能一眼看出来这是一个二分答案板题的加强版(
若 ,则不难想到用权值线段树维护 并使用线段树上二分求答案。
扩展到一般情况,可以直接在内层套上一棵线段树维护下标。
当然并没有这么简单。线段树套线段树空间会超出限制。以下是几种可行的解决方案:
-
改为分块套线段树,也许能过但是极不优美,出题人并不推崇这种做法。如果没有脑子,时间复杂度为 ;正常时间复杂度为 。
-
改为分块套值域分块,那么根据复杂度的平衡,需要做到 单点修改, 查询前缀和。
-
改为树状数组套线段树,并在内层维护值域,那么查询时需要做多树二分,时间复杂度仍然为 。
-
改为树状数组套线段树,并在外层维护值域,那么查询时可以使用树状数组上二分或倍增的技巧,稍微好写一些,常数可能也小一些,时间复杂度仍然为 。
-
改为整体二分,也比较好写,因为需要维护的信息比较简单,这个做法唯一的弊端是离线,时间复杂度仍然为 。
复杂度 。
F
令 。
显然对任意整循环串都恰好存在一个本原平方串前缀。
注意到与 相交意味着左端点不超过 。而若提取本原平方串后缀则字典序更小且显然也满足条件,故仅需要考虑本原平方串的贡献。
考虑枚举每个 run 中所有本质不同的本原平方串,根据 Three Squares Lemma,这样的本原平方串共有 个。
容易知道每个本质不同的本原平方串仅需要考虑第一次出现的位置即可。
于是可以将这 个本原平方串排序得到其排名,容易发现我们需要查询任意两个后缀的 LCP 长度。使用二分 + 哈希,可以做到 ,常数优秀可能可以通过。而通过后缀数组 + ST 表可以做到 。
从而对于询问就不难处理了。
可以使用并查集简单处理区间覆盖,尽管垃圾标算写了线段树。
复杂度 。
G
注意到 ,这提示我们考虑单位根反演。
进一步地,容易发现若能求出
在 处的值,则可直接 计算出答案。
则容易发现 。
有趣的是,若对 分解质因子得到 ,则有
若代入具体的一个值 , 便可以视为一个关于 的积性函数。
使用 Min_25 筛 / 洲阁筛计算即可。
复杂度 。
当然也存在更显然的直接计算 处前缀和的做法,不予赘述。
之所以说没有 也能做,是因为你完全可以直接代入 个 之后插值。加入这个条件纯粹是为了减小常数。
题外话
这个 B, C 本来是反的,朋友验了题之后建议我 swap(事实上从内测成员的表现来看,这个 C 放到 D 甚至 E 可能都不过分)。
另外其实很可能这个 G < F,不过 F 的难度全在科技,事实上几乎并没有什么思维难度。
事实上最开始的 F 也是个较为简单的偏向科技(拉格朗日反演)的多项式题,但是被吐槽数学题太多就换掉了(
另外虽然可能有些人知道我非常喜欢多项式,但是可以注意到这场的多项式浓度和难度都极低!!!我是不是很良心(