2016 Multi-University Training Contest 8 solutions BY 学军中学
1001:
假设有4个红球,初始时从左到右标为1,2,3,4。那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4。 那么就可以把同色球都写成若干个不同色球了。所以现在共有n个颜色互异的球。按照最终情况标上1,2,。。,n的序号,那么贪心的来每次操作就是把一个区间排序就行了。
1002:
环加树的同构计数问题。假如没有环,那么可以在树上dp来计算答案,具体方法是,把根节点的所有同构的子树看成相同的,然后用隔板法,算组合数即可得到答案。树的同构可以利用哈希来解决。有环的情况就是一个经典的polya计数问题了。
1003:
直接状压dp就行了,f[S]表示点集S的色数,枚举子集转移(子集是独立集)。这样是3^n的。 一个复杂度更优的做法是把所有独立集都预处理出来,然后作n次or卷积。这样是n2*2n的。
1004:
令xi表示联通块i是否存在(且i为树), 图的权值为(Σxi)^m。对于某k个联通块,如果它们同时在图中出现,那么贡献为S(m, k) * k!, 其中S(m, k)是第二类斯特林数。
令fn为n个点的无向连通图个数,gi,j为i个点j个连通块的无向图个数。
f与g均可通过简单的dp求得。再将求出来的东西套入之前的斯特林数式子就可以计算答案了。
为了通过此题,计算dp的过程可能需要FFT来优化。
1005:
先来考虑一个排列可到达的条件是什么。 如果不是 n 排列,而是 01 序列的话,那么条件是显然的:只要对于任意 i,序列 b 的第 i 个 1 都位于序列 a 的第 i 个 1 的右边(不一定严格),那么 a 就可以到达 b。 对于一个 n 排列 a,以及一个数 k,把 a 中大于 k 的数标为 1,剩下的数标为 0,就能得 到一个 01 序列。如果对于任意的 k,排列 a 对应的 01 序列都能够到达排列 b 对应的序列,那 么排列 a 就可以到达排列 b。它的必要性是显然的。至于充分性,可以观察下面这个移动策略: i 从 n 到 1 的顺序,每次将数字 i 移到它的目标位置,令当前位置为 l,目标位置为 r,当前 (l, r] 区间的最大数字为 a[j],那么把 a[l] 和 a[j] 交换一下即可。容易看出这样移动一定是可行 的。 然后根据这个移动策略建图,图结点数是n*n!的,而且两个可达排列之间只有唯一一条路径,所以可以按拓扑序递推。
1006:
简单的物理题,发现球的碰撞只是交换了速度,因此可以看成没发生碰撞。这样解一个微分方程就可以算出每个球经过t秒之后的速度,如果球的初速度为v, 那么t秒后,球的速度为sqrt(v ^ 2 + 2tC). 只需要最开始对每个球的速度排序好就行了。
1007:Rikka with Parenthesis
如果 \(n\) 是奇数,那么所有括号序列的权值都是 \(10^{100}\),答案是 \(0\)。 如果 \(n\) 是偶数,不难发现所有长度为 \(n\) 的括号序列的权值都不超过 \(2\)。 对于任意一个括号序列 \(S\),把匹配的括号消去之后,一定是若干个右括号接若干个左括号的形式。所以只要第一次操作反转所有右括号,第二次操作把后半部分右括号反转成左括号,就得到了匹配的括号序列。 令 \(N=\frac{n}{2}\)。 \(A_0\) 就是卡特兰数 \(h_N=\frac{\binom{n}{N}}{N+1}\)。 \(A_1\) 是一段连续的左括号或者连续的右括号中间夹着一些匹配的括号序列,可以得到递推式 \(f_i=\sum f_{i-2j-1} \times h_j\),方案数就是 \(2(f_i+f_{i+1}-h_N)\),可以得到 \(A_1=2\binom{n}{N}-2A_0\)。 \(A_2\) 就是剩下的括号序列个数,即 \(2^n-A_0-A_1\)。 问题就变成了怎么在任意模下求组合数,可以用中国剩余定理转化为求模 \(p^q\) 下的组合数,其中 \(p\) 是质数。可以将所有数表示成二元组 \((a,b)\),表示这个数是 \(a \times p^b\),其中 \(\gcd(a,p)=1\),因此 \(a\) 的部分的运算是可以直接对 \(p^q\) 取模的,得到答案后将二元组转化成整数即可,最后用中国剩余定理合并。 时间复杂度 \(O(n \log m)\)。
1008:Rikka with Sequence
将序列差分,即令 \(B_i=A_i-A_{i-1}\),那么区间加操作就变成了单点修改。 考虑区间开根号操作,当 \(B_i=0\),即 \(A_i=A_{i-1}\) 时,开完根号 \(B_i\) 依然是 \(0\)。对于 \(B_i \neq 0\) 的项,因为对于正整数 \(a,b(a > b)\),有 \(\sqrt a- \sqrt b < \sqrt {a-b}\),所以在操作后 \(B_i\) 的绝对值严格小于它的根号,因此 \(B_i\) 如果不被修改,在 \(O(\log \log n)\) 次操作后一定会变成 \(0\)。 于是我们可以把连续相同的段放到一起进行维护,开根号时可以直接扫区间中的每一段进行开根号。维护的方式很多,线段树或者树状数组加 Set 都可行。 时间复杂度 \(O(n \log n \log \log n)\)
1009:Rikka with Subset
首先将所有数从大到小排序,考虑排序后每一个数作为第 \(k\) 大的贡献 \(f_k\),那么有 \(f_k=\sum_{i=1}^n \binom{i-1}{k-1} 2^{n-i} A_i\) 用 FFT 进行优化即可,时间复杂度 \(O(n \log n)\)
1010:Rikka with Subset II
枚举直径的终点 \(i\),进行一次 BFS 求出到 \(i\) 距离为 \(j\) 的点的个数。 枚举直径 \(d\),那么所有以 \(i\) 为直径中心直径为 \(d\) 的点集满足所有点到 \(i\) 的距离都不超过 \(\frac{d}{2}\),至少有两个点到 \(i\) 的距离等于 \(\frac{d}{2}\),同时在以 \(i\) 为根的情况下,至少有两个孩子的子树中存在距离等于 \(\frac{d}{2}\) 的点。 预处理一下 \(i\) 的每一个孩子 \(j\) 的子树中到 \(j\) 距离为 \(k\) 的点的个数,累加答案即可。 时间复杂度 \(O(n^2)\)
1011:Rikka with Parenthesis II
最优情况下一定交换第一个右括号和最后一个左括号,交换后判断一下即可。 时间复杂度 \(O(n)\)