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\)

代码: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\)

posted @ 2022-08-18 10:37  csxsi  阅读(60)  评论(0编辑  收藏  举报