0%

300iq Contest 简单题选做

wyr 看了某场 ACM,并惊奇的发现他不会签到题。

比赛链接

L. Modulo Magic

题意

中有多少个不同的数字。

题解

不妨假设 ,求出 有多少不同的值,可以发现 的情况放进去没有影响。

考虑对于 的情况, 的值应当等于

而这些数字覆盖了所有 的整数。

可以发现此时 的数字,。所以他们对答案没有贡献。

最终答案为 内整数个数,即

提交记录

K. Number Theory

题意

给定质数 ,令 表示最小的 使得存在 满足

题解

考虑先预处理出哪些数字能被表示

根据数论相关的知识,可以知道恰好有一半的数字能被表示出来。

考虑从小到大枚举 ,然后对于每一个数字依次判断是否存在 。直到所有数字都能被表示出来。

若答案为 ,则复杂度为 最大期望在 级别,因此 应该不大,可以通过。

打表可知在 时答案为 ,为 中的最大值。

提交记录

H. Equal MEX

题意

给定一个长为 的序列

现在你需要将整个序列划分为若干段,使得所有段的 值相同。求方案数。

题解

设整个序列的 值为 ,最后划分为若干段 的段。

首先可以知道一定有

,可以知道整个序列中肯定有值为 的元素,不然 应当

而划分出的所有段 都为 ,这说明所有段里都没有值为 的元素。

这矛盾了,说明不可能 。那么一定有

那么这就相当于问:有多少方案将整个序列划分为若干段,使得每一段的 是一个数字

这就可以 dp 了,令 表示将前 个元素划分为若干段的方案数。

那么如何转移呢,如果 能转移到 ,那么说明 这段区间的

可以发现满足条件的 是一段前缀,那么直接双指针一下,顺便维护 即可。

具体细节可以看代码,复杂度 提交记录

B. MST

题意

给定一个长为 的序列

现在有一个 个点的无向完全图,两个点 之间的边权是

求最小生成树边权和。

题解

有一个 Boruvka 的 做法,但有点无聊。可以去看官解。

首先如果 ,那么答案是

然后考虑这么一件事情,设整个序列中最大的数字是

,那么可以发现点 最多连了一条边。

为什么呢,假设有两个点 都与点 有连边,那么把 这条边改成 ,总边权显然变小,连成的边仍然是一棵树。

假设全局最小值是 ,那么可以知道点 一定只和点 有连边,那么整体答案就是前 个位置的答案

否则有 时,可以发现,对于点 内的所有点,肯定独立连成了一个连通块。证明比较简单,和上面一样调整一下就好了。

考虑这个连通块内部的连边。

对于一个点 ,要么和 连边,要么和 的点里边权最小的点连边,那么直接从后往前 for 一遍求出内部边权。

这一段里最小值是

考虑连通块外部的连边,可以发现 的点如果要和 的点连边,肯定只能和点 连边。

那么我们令 , 然后剩下的部分相当于 内点的答案。

提前预处理每一个前缀,最小值和最大值的位置,即可 解决。

提交记录

G. Circle Convertation

题意

给定两个字符串

定义一次操作为选择一个 ,使得 ,然后翻转这两个字符。

构造一组操作次数不超过 的方案,使得最终 ,数据保证有解。

题解

没有 300iq,做不出来这题。

,然后分类讨论。

为奇数的时候,可以发现一定可以将 变为全 或全 的。

具体操作是这样的,如果 当前不是全 或全 ,考虑将 划分为若干连续段。

容易发现一定能划分为 偶数段

而这意味着一定存在一段长度为偶数,那么我们把这个偶数段整个 flip 一下,连续段个数一定减少。

一直做这个操作,直到只剩到一个连续段,此时 一定只存在一种元素。

那么这就将 变成了全 或全

注意到操作并不会改变 个数的奇偶性,那么 可以变为全 和可以变为全 一定恰好满足一种。

然后我们把 操作成全 或全 ,然后把操作倒着拼后面就好了。

为偶数时:考虑把 所有偶数位上元素 flip 一下。

这样操作就变成了交换相邻两个元素,冒泡排序一下,然后把 的操作一样倒着拼后面。

提交记录

F. Good Coloring

题意

现在有一个 个点 条边的无向图。

现在给定了一个这张图的 染色方案,第 个点颜色为 ,满足一条边连接的两个点颜色不同。

现在你需要给出一个 染色方案,满足 ,且存在一条恰好有 个点的路径,使得这个路径上 种颜色都出现了。

题解

没有 300iq,做不出来这题。

考虑给所有边定向,方向为从颜色小的点指向颜色大的点,这样整张图就变成了一个 DAG。

最终每一个点的颜色为,其所有前驱中颜色最大的点,颜色 +1。

可以发现,若一个点颜色为 ,则要么 ,要么其存在一个前驱颜色为

那么我们找一个颜色最大的点,一直跳前驱,就能找到一个恰好有 个颜色的路径。

提交记录

C. Tree Circles

题意

现在有一棵 个点的树,第 条边连接了两个点

定义一个以点 为直径, 为半径的圆为:只保留编号 的边所形成的连通块内点。

现在有 组询问,每一组询问给出 个点

求有多少组直径 ,满足对于

题解

这题找到一个能过的解倒是不难,但是很难找到一个好写的解。

考虑两个圆不相交,其实相当于每一个圆没有覆盖别的关键点。

表示最大的 ,使得 不覆盖别的关键点,那么答案为

问题在于 怎么算。

考虑建出一个类似于最小生成树的重构树的东西,然后按照中序遍历存下每一个点。

那么两个点 之间编号最大的边,就是他们在这个中序遍历上,中间边权最大的边。

直接把 个点按照序列上的顺序排序,那么 就是点 和左右两侧点询问的 min。

st 表处理 rmq 即可。

时间复杂度

提交记录

A. Zero Sum

题意

现在有一个 的数组,第 行第 列元素是 ,列从 编号。

现在你需要选择 个下标 ,满足

找出最小的

题解

这题这么水怎么过的人这么少。

表示确定完了前 个下标,当且所有下标的和是 ,最小的 和是多少。

显然这是一个 的做法,过不了。

考虑将这个数组的所有行随机打乱,那么最优方案期望的 应当是 这个级别左右的。

考虑取 ,在做 dp 的时候只保留 的状态,期望可以通过。

时间复杂度 就是 的。

提交记录

D. Angle Beats 2.0

题意

现在有一个 的矩阵,每一个格子上是 .* 两种符号之一。

定义一个图案是一个 * 和两个与这个 * 相邻的 .,并且他们组成了一个 L 形。

问有多少种方案,画出若干不相交的图形,使得每一个 * 都在一个图形中。

题解

读懂题意就是简单题啊。

考虑一个 * 一定有一个左右的 . 和一个上下的 . 要和他匹配。

考虑把每一个 . 当成点建一个图,一条边表示其连接的两个点至少有一个需要选择。

那么对于一个 *,就将其上下两个位置的 . 连一条边,如果只有一个位置有 .,那就给这个位置连自环。

显然,建好图之后形成了若干个连通块,考虑分类讨论。

第一种情况是边数>点数,此时显然无法满足要求。

第二种是边数=点数,这种情况是一棵基环树。

此时每一条边需要选择其两个端点之一,显然下面的树只有唯一的选择,环上有两种方案。

值得注意的是,如果这个环是自环,那么只有一个方案。

第三种情况是边数<点数,此时显然 边数=点数-1,那么方案数就是连通块内点的个数。

所有连通块答案乘起来即可。

提交记录

I. Cactus is Money

题意

给定一个 个点 条边的无向图,保证一条边最多出现在一个简单环种。

条边有两个权值

现在你需要选出一棵生成树,使得 最小。

题解

考虑只有一个环可以选出哪些生成树。

可以发现一个 个点的环对应了 种方案,而最优解只可能出现在这些点构成的下凸壳上。

现在相当于我们要在若干个下凸壳上各选出一个点,使得代价最小。

可以发现这相当于是需要合并下凸壳。

使用闵可夫斯基和,每一次启发式合并最小的两个凸壳即可。

复杂度 。好难写。

提交记录

E. LIS

题意

给定 个长为 的序列

建立一张 个点的有向图,有边 当且仅当

求这张图的最长路。

题解

考虑 dp,用 表示以 结尾的最长路。

考虑使用线段树套李超树进行维护,外层的线段树,区间 维护所有 的直线。

查询 的时候,在外层线段树上进行线段树二分,查询 是否可以为 ,相当于 这个区间的直线里,是否有 这个地方的点值 的。

查询值之后,将点 的线段 插入到 这个位置即可。

时间复杂度

提交记录

其实就剩一个题了但我还没琢磨懂这个题解。