2025 贵阳 代码源 Day 16 模拟赛
Day 16 模拟赛
upd in 2025/8/9: 新增 B 题题解。
A
赛时神秘打表找到规律对于每种颜色的贡献就是 \([(v_i+1)^{a_i}-1]\times \frac{2^1\times2^2\times\dots2^n}{2_i}\),这里还是用二项式定理推一下吧。
二项式定理即为
原题中一种颜色的贡献其实可以写成
这一步带入二项式定理中 \(n=a_i,a=1,b=v_i\) 得
最后乘上可能的数量即可。
B
严格难于CD(
需要发现关键性质,对于任何一个由 \(n\) 的因数组成的序列 \([a_1,a_2,\dots,a_{2m}]\),设其中所有元素的乘积 \(\prod\limits_{i=1}^N a_i=mul\),我们可以建立一个其和 \(n\) 除以它的映射,也就是 \([b_1,b_2,\dots,b_{2m}],b_i=\frac{n}{a_i}\),这个映射对于所有序列一一对应而且不重不漏,也就是说任何一个由 \(n\) 的因数组成的序列都有一个同样满足【由 \(n\) 的因数组成】的条件的映射。因此可以得出所有 \(mul<n^m\) 的序列数量 \(=\) 所有 \(mul>n^m\) 的序列数量。原因你可以分析,所有 \(mul<n^m\) 的序列对应的映射都是 \(mul'=\frac{n^{2m}}{mul}>n^m\),反之也是同理;所有 \(mul>n^m\) 的序列对应的映射都是 \(mul'=\frac{n^{2m}}{mul}<n^m\)。这里很关键可以思考一下。
到此我们已经找到了题目的对称性,也即以 \(mul=n^m\) 为界两侧数量和映射关系对称,这时做法就和 这题 差不多了。设所有由 \(n\) 的因数组成的序列数量为 \(tot\),设 \(mul<n^m\) 的序列个数为 \(cnt_{less}\),\(mul=n^m\) 的序列个数为 \(cnt_{eq}\),则有答案为 \(cnt_{less}+cnt_{eq}=\frac{tot-cnt_{eq}}{2}+cnt_{eq}=\frac{tot+cnt_{eq}}{2}\);因为我们需要的答案是所有 \(mul\leq n^m\) 的序列,而所有 \(mul=n^m\) 的序列的映射依然是 \(mul'=n^m\) ,所以如果我们直接求 \(\frac{tot}{2}\) 就会漏掉一半的 \(mul=n^m\) 的情况。
至此我们只用求 \(cnt_{eq}\) 即可。发现将 \(n^m\) 分解质因数后每个相同的质因子分别放在哪是独立的,这时方案数只跟该质因子的次数有关;若 \(n=p_1^{q_1}\times\dots\times p_k^{q_k}\),则有 \(n^m=p_1^{mq_1}\times\dots\times p_k^{mq_k}\),也就是我们枚举每个 \(q_i\),对于这 \(2m\) 个位置上每一个位置最多放 \(q_i\) 个 \(p_i\),总共恰好放 \(mq_i\) 个 \(p_i\),注意到 \(m\) 很小直接做 dp 即可。
C
发现图的 \(B\) 集合的边界会是一个 \(x\) 正方向上 \(y\) 坐标单调不递减的折线,枚举折线每一个上凸点作为 dp 转移的关键点。
考虑 dp,状态表示为 \(f_i\) 代表枚举到当前点时上一个点的 \(y\) 坐标为 \(i\) 再转移到当前点的最大价值,转移的顺序就是以横 (\(x\)) 坐标为第一关键字,以纵坐标为第二关键字。这时 \(B\) 集合的范围我们认为是在所有横坐标严格小于当前点中,转移的上一个点所包含的 \(B\) 点集和这两个点横坐标之间纵坐标小于等于上一个点的点集。
dp 的转移就是我们枚举每个点,设 \(y\) 代表当前点的纵坐标就有 \(f_y\gets\min\limits_{j=1}^{y-1}(f_j)\),就是说我们考虑选这个点作为关键点时,一定从上一个点的纵坐标小于当前点转移过来;这时我们还要考虑当前点对后续点的影响,所以有 \(f_j\gets f_j+b_i,j\ge y\),\(f_j\gets f_j+a_i,j<y\),解释就是若上一个关键点纵坐标大于等于当前点纵坐标,则 \(B\) 点集就一定会包含当前点,就加上 \(b_i\) 的贡献;反之亦然。
发现下标太大会爆,考虑离散化。发现操作查询为区间加区间查最大值,考虑线段树优化,复杂度 \(O(n\log n)\)。
D
非常难得在赛时切掉这道题上了大分,这里讲一下思路。
发现符合条件的边一定属于所有 \(1\to n\) 的最短路径的交集,那么我们把所有原图的最短路径并在一起就得到了一张最短路径 DAG,把其中的单向边改成双向边跑边双连通分量找桥,找出来的桥也就是所有最短路径的交集。
但我们发现这样会算重,发现还要满足一个性质,就是如果我们把所有路径长度 \(>\) 最短路径长度 \(+1\) 的路径称为次短路,我们找出来的边就需要保证至少一条次短路不包含这个边;我们发现这种边集的反集就是将所有次短路并起来建双向边后的图的桥,也就是我们找出来的边不属于次短路图上的桥,且需要属于最短路图上的桥。
考虑求最短路图和次短路图。发现前者好求,枚举每一条边 \(\{u,v,w\}\),设原图最短路径长度为 \(DIS\),判断其是否满足 \(dis_{1,u}+dis_{v,n}+w=DIS\),满足则在最短路图上加入这条边。发现次短路图求法略有差别,如果判断 \(dis_{1,u}+dis_{v,n}+w=DIS+1\) 则每一条次短路径上只有一条边会被判到,但发现不被判到的那些边都会属于最短路图。暴力加边会爆,还得需要打标记加边。
我们依然按照找 \(dis_{1,u}+dis_{v,n}+w=DIS+1\) 的方式来找边,这时还剩下 \(1\to u\) 的最短路径和 \(v\to n\) 的最短路径没加,发现这些路径上的边都会在最短路图上,所以我们考虑在最短路图上面找到这些边并加入。我们建最短路图径 DAG 并在上面跑拓扑排序,发现所有 \(v\to n\) 路径上的点的拓扑序都不小于点 \(v\) 的拓扑序,且它们被拓扑遍历到时的路径一定会经过点 \(v\)。所以我们考虑将点 \(v\) 打上标记,并会在拓扑排序的过程中将每个点的标记下传到所有它的出边的节点上;对于有标记的点我们将所有它的出边加入到次短路图中,这样所有 \(v\to n\) 路径上的边都会被正确加入进次短路图中。发现 \(1\to u\) 上路径的寻找方式差不多,只需要将原图的 DAG 取反图再跑一样的拓扑排序即可。这里注意需要记录下来每条边是否被加入,因为我们的次短路图不能出现重边。虽然我们是在 DAG 上跑图和加边,但我们为了找桥还是需要把单向边转双向边加边。
接下来我们在找好的两张最短路图和次短路图上跑边双找桥然后判断就好了。