Discover Singapore 2019 by Moscow Workshops. Day 5. 300iq Contest 部分题解
比赛链接:http://qoj.ac/contest/947。
A. Zero Sum
朴素 dp:设 \(f_{i,j}\) 表示前 \(i\) 行选的数的下标之和为 \(j\),所得到的最小和。复杂度 \(\mathcal{O}(n^2k^2)\)。
有一个很神奇的结论:将一个长度为 \(n\)、和为 \(0\) 的值域为 \(-1/1\) 的序列随机重排,那么这个序列的最大前缀和期望是 \(\mathcal{O}(\sqrt n)\) 级别的。
扩展一下这个结论,将值域变成 \([-k,k]\),最大前缀和期望就是 \(\mathcal{O}(k\sqrt n)\)。
所以我们可以在 dp 的时候限制第二维的值域大小在 \(\mathcal{O}(k\sqrt n)\) 以内,那么这个朴素 dp 的复杂度就是 \(\mathcal{O}(n\sqrt nk^2)\) 的了。
代码:https://pastebin.ubuntu.com/p/PQRXZ8RKw6/。
B. MST
考虑 Boruvka 算法,每次记录前缀最大 / 次大值和后缀最小 / 次小值,需要保证最大(小)值和次大(小)值所属的连通块不同。然后就是直接跑 B 算法了。
其实关键就在于找前缀 / 后缀不属于该连通块的极值是多少怎么做,剩下的就都是套路了。
代码:https://paste.ubuntu.com/p/wtTbnxCs9n。
C. Tree Circles
考虑一个点的半径的范围就是 \(0\sim\) 最大的边权 使得 从它开始只走 \(\le\) 这个权值的边 不能到达除它以外的任何一个关键点。
这个可以建出 Kruskal 重构树,然后用一个树状数组 + 倍增,没有脑子。
代码:https://pastebin.ubuntu.com/p/39ZkpZr3CY/。
D. Angle Beats 2.0
神必题.jpg
对于每一个 *
,我们将它拆成两个点,其中一个点向左右的 .
连边,另一个向上下的 .
连边。
我们假设这条边对应的末端为这个 *
选择连接的 .
。那么显然每一个 .
的入度都是 \(1\)。
那么我们对于每一个连通块单独考虑,总的答案就是所有连通块方案数的乘积:
- 设 \(c1\) 为连通块里
*
的数量,\(c2\) 为连通块里.
的数量,\(c3\) 为连通块里的边数;- 若 \(c1>c2\),那么肯定会有一个
.
入度大于 \(1\),此时方案数是 \(0\); - 若 \(c1=c2\):
- 若 \(c3=c1+c2\),说明这个连通块是一个基环外向树,环上有两种定向方案,方案数是 \(2\);
- 否则就是一棵树,并且每一个
.
和一个*
一一对应,方案数是 \(1\);
- 若 \(c1<c2\),那么我们可以将任意一个
.
作为根,构造一棵外向树,此时显然合法,方案数是 \(c2\)。
- 若 \(c1>c2\),那么肯定会有一个
代码:https://pastebin.ubuntu.com/p/zWcdKdtSvy/。
F. Good Coloring
妙妙题。
考虑给每一条边定向,将颜色编号小的向编号大的连边,不难发现这肯定是一张 DAG。
在这上面跑拓扑排序,定义每个点的深度(即新颜色)为所有向它连边的点中深度最大的点的深度 \(+1\)。
那么找到新图中一条从 \(dep=1\) 的点到 \(dep=\max\limits_{i=1}^n\{dep_i\}\) 的点的长度为 \(\max\limits_{i=1}^n\{dep_i\}\) 的路径,这个新图肯定满足题目条件。证明略。
核心在于给无向图定向变成 DAG 的操作,非常的神奇。
代码:https://paste.ubuntu.com/p/QSm8k7SmNb。
H. Equal MEX
套路题。
如果将序列分成若干段,它们的 MEX 相等,那么这个相等的 MEX 肯定是整个序列的 MEX。
考虑 dp,设 \(f_i\) 表示将 \(1\sim i\) 划分成若干段,每段的 MEX 都等于全局 MEX 的方案数,那么它肯定是由一段前缀的 \(f\) 的和转移过来,双指针即可。
代码:https://paste.ubuntu.com/p/JMw73tPbDc。
K. Number Theory
暴力题。容易发现答案很小,直接存下来所有 \(b^2\bmod p\) 的值,枚举 \(a\) 就行。
代码:https://paste.ubuntu.com/p/fmwBdwzGqS。
L. Modulo Magic
签到题。不难发现对于所有 \(i\ge\lceil\frac{n}{2}\rceil\),所有的 \(n\bmod i\) 都不一样,且取遍了 \(0\sim\lfloor\frac{n}{2}\rfloor\) 的值。而对于所有 \(i< \lceil\frac{n}{2}\rceil\),肯定有 \(n\bmod i\le \lfloor\frac{n}{2}\rfloor\)。所以答案为 \(\lceil\frac{n}{2}\rceil\)。