构造题选做
集训拉的题单,随自己听课进度和思考进度更新(
题目标号和ppt中不相同,因为有些题我skip了(
怎么 My Solution 这么少啊(大嘘)
T1
\(2n\) 个点的完全图,要把这些边分成 \(2n-1\) 组,每组 \(n\) 条边,且每条都是一个匹配(任意两条边没有公共点),\(n \leq 1000\)。
motivation: 从要求答案的构造特点入手,寻找直观情况
solution:
My Solution
题目要求的是匹配,匹配最常见的是二分图匹配,那么构造就先考虑变成二分图,左边 $n$ 个点,右边 $n$ 个点。这左右两边部分点之间的连边中,每个点都会连出去 \(n\) 条,那么可以简单的构造出 \(n\) 组。
接下来,就只用考虑左边内部和右边内部的连边如何构造出 \(n-1\) 组。
这个时候就需要对 \(n\) 进行奇偶讨论,因为左边每次选 \(2\) 个不重复的,如果是奇数,就会单出一个点来。
考虑简单的偶数情况,那么左边点和右边点都可以选出 \(\dfrac{n}{2}\) 条边,合在一起就是 \(n\) 条边的一个集合了,那就简单了。
左边的每个点都会向左边的其他点连出去 \(n-1\) 条边,于是一定也可以构造出 \(n-1\) 条边,如何构造,可以每次直接从第一个点进行 \(dfs\),然后每次加入一条边,加入的边如果选中了两个没有被选中过的点,然后就把他存下来,并且标记用过这条边了。
然后选中 \(n\) 个点了之后就可以推出,把选了的边加入答案,同时,将他们从图中删除,所以存边用 \(set\) 存。
这样的话,复杂度是 \(O(m\log n)\) 的,没啥问题,右边同理,于是 \(n\) 为偶数的情况解决。
现在转过来考虑 \(n\) 为奇数的情况,那么左右边都只能选出 \(\lfloor \dfrac{n}{2} \rfloor\) 条,这样还差一条边,但是左右都剩了一个点,我们考虑用这两个点补全一下,可能很舒服,嗯?
那么在左边和右边的匹配中,每个点都留一条边到对面的点,这样中间就只会构造出 \(n-1\) 个匹配,接下来就要用左边和右边的 点构造出 \(n\) 个匹配。
每次先让左边保留一个点,让他和右边的进行匹配,那么对于剩下的 \(n-1\) 个点,这时候是偶数,随便选一个内部的匹配出来,这样完成了一组构造。
那么总共有 \(n\) 个点可以保留,做 \(n\) 次就可以获得合法的 \(n\) 个组合。
然后这题就做完了,复杂度实现应该是 \(m \log n\) 的。
Offcial Solution
先把点按 \(0 \sim 2n - 1\) 标号,考虑如下构造,对于一组边 \((x,y)\) 满足 \(0 \leq x < y < 2n - 1\),我们把它们扔到 \((x + y) \bmod (2n - 1)\) 这一组,注意到 \(2n - 1\) 是个奇数,因此对于每个 \(i\) 存在唯一的 \(k\) 使得 \(2k = i (\bmod 2n - 1)\)。
把 \(k\) 和 \(2n - 1\) 的连边扔到 \(i\) 这一组就好了。
不难发现这样的构造所有边都被使用了至少一次,因此是个合法的构造。
T2
一个 \(n\) 个点的完全图,你需要从中选出尽量多的不交的树,\(n \leq 1000\)。
motivation: 寻找答案上界,归纳构造
solution:
Offcial Solution
考虑答案的上界,最直观的想法是 \(\dfrac{\dfrac{n(n-1)}{2}}{n-1} = \lfloor \dfrac{n}{2} \rfloor\)。
知道了答案的上界,我们希望的是能尽量的去构造接近这个上界,但是即使如此,我们也只是知道了答案上界,对解题看起来没什么帮助。
我们不妨进行归纳法假设进行构造!我们假设当前构造合法取到上界,然后考虑将 \(n\) 变大一点去怎么构造接近这个上界。
于是假设 \(n=2k\) 的时候是合法的,我们希望证明 \(n=2k + 1,2k+2\) 也可以是成立的。
现在为了让 \(n = 2k + 1\) 合法,那么随便拿 \(k\) 个点连向它就是了。
因为此时每个点都存在于一棵选出来的树中。
同样的当 \(n = 2k + 2\) 的时候,我们选 \(1 \sim k\) 这些点连上 \(2k + 1\),\(k + 1\sim 2k\) 这些点连上 \(2k + 2\),这样就让之前的 \(k\) 棵树都加上了新的 \(2\) 个点。
接下来做一棵新的树,让 \(2k + 2\) 连向 \(1 \sim k\),\(2k + 1\) 连向 \(k + 1\sim 2k\),然后 \(2k + 2\) 连向 \(2k + 1\)。
于是构造完了,归纳构造厉害的。
虽然我好像一开始只想到了取链,然后被pass了
T3
一个 \(n \times n\) 的方格表,每个格子里有个字母。
每次可以让某行的所有字母向右循环平移若干格,或者把某列所有字母向下循环平移若干格。
若某行连续的三个字母为 \(k,e,y\),则成为一个键,你需要在 \(10000\) 次操作内最大化键的数量。
\(n \leq 40\)。
motivation: 猜想答案上界形式,分析矩阵长度影响
solution:
Offcial Solution
猜想矩阵是什么模样的时候,答案取到上界,并且尽可能有一些规律。每一行应该从左往右都是 \(\textbf{keykey} \dots \textbf{key} \dots\) 的时候是最优的,那么我们现在就去构造一个这样的局面。
考虑一列一列的操作,假设现在是第 \(k\) 列,前 \(k - 1\) 列都是 \(\textbf{keykey} \dots \textbf{key} \dots\) 的形式,那么对于第 \(k\) 列,我们首先还是要把这一列填满成 \(\textbf{k}\)。
找到这一列某一行后面有一个 \(\textbf{k}\),大家都玩过魔方吧w
可以考虑用魔方的方式来移动,先将这个 \(\textbf{k}\) 下移一位,然后把这一行循环移动到要填的第 \(k\) 列在 \(\textbf{k}\) 上面,然后在把 \(\textbf{k}\) 上移,再把这一行移动回去就好了
当然如果这一列放不满 \(\textbf{k}\),就把除了 \(\textbf{e, y}\) 的其他字符放进来,如果只剩下 \(\textbf{e, y}\) 了,那么就计算出最优情况下 \(\textbf{e, y}\) 的使用次数,这里因为 \(\textbf{k}\) 没了,所以是可以知道的,然后优先把 \(\textbf{e, y}\) 会剩下的移动过来就好了。
如果列数不为 \(3\) 的倍数,那么最后一列不用管,但是如果是的话,还需要考虑最后一列的顺序怎么换。
最后一列和倒数第二列显然会尽量分别为 \(\textbf{y, e}\),如果数量有为 \(n\) 就不用管了,所以只用考虑数量 \(< n\) 的情况,那么循环位移后,肯定存在一行使得两个格子都是其他字符,用这两个格子转移即可。
操作次数估计一下为 \(4n^2 = 6400 < 8000\),然后做完了。
T4
给定一个 \(1 \sim n^2 + n\) 的排列,从中选出一个长度为 \(2n\) 的子序列,使得其中第 \(2k\) 和 \(2k - 1\) 大的数再子序列中位置相邻。
构造这个子序列,或者说明不可能,\(n \leq 1000\)。
motivation: 观察对答案影响,分段式计算
solution:
Offcial Solution
要求说明不可能的情况,一般是他在这里吓你,本来应该是百分百构造可行的,或者说这道题的突破点就在这里。大胆猜想他是在骗我们,并且他不是让我取数是相邻的🐎
那么我们继续大胆猜想肯定可以每次直接选出 \(2k\) 和 \(2k - 1\) 大的数。
考虑选了最小的和次小的之后的两个影响:
- 比最小值更小的就不能选了
- 在最小和次小之间的都不能选
然后从第二条入手,你智慧的想到把序列分成 \(n\) 段,每段 \(n + 1\) 个数,我们每次找到第二小的数字最小的段,把这段最小和次小的数字加入子序列中,并且把其他段里小于这段第二小的位置全部删掉。
注意到一次只会删掉一个段,且所有其他段中数字个数至多减少 \(1\),所以一定有解。
T5
给定一个环,环上每个点是三种颜色之一,若一个点左右点颜色不一样,你就可以任意改变这个点的颜色。
问能否在 \(10n\) 次操作内把一个环变成另一个,如果能,给出构造。
\(5 \leq n \leq 10^5\)。
motivation: 环的特性,不要让无法操作的情况出现
solution:
My Solution
感觉给不出构造方案的就很简单的判断,如果全部为同一种颜色就改变不了,然后如果此时和另一个环不一样那么就无法构造了。否则的话,我们一定可以进行构造,因为一定可以构造到每个点都可以进行颜色的改变。
于是先考虑构造出每个点的颜色都可以改变的情况,不然很容易中途就无法构造了。
这个是简单的,对于一个球,把他的颜色变得和他距离为 \(2\) 的两个球颜色都不一样就好了。
如果直接让每个球变成对应的颜色的话,然后在变一下和他距离为 \(2\) 的点进行补救使得可以让下一个球进行操作,咦,好像行了,也就是:
将球顺序标号为 \(1 \sim n\)。
\(1\) 球变了之后,改一下 \(3\) 球的颜色使得和现在 \(1\) 球的颜色不一样,如果本来就不一样就不用改了,因为这样 \(2\) 球才能继续操作,对于 \(2\) 球同理的,先变的和要求的 \(2\) 球一样颜色,然后改一下 \(4\) 球颜色 \(\dots\),现在是第 \(n - 2\) 个球改了,改第 \(n\) 个球的颜色,然后 \(n - 1\) 个球改,现在需要改第 \(1\) 个球的颜色,等等,无法改了?
然后我寄了,== 。
看了题解说要求改点 \(1\) 的时候额外再改一下点 \(n-1\) 使得颜色都不一样就行了,让 \(n - 1\) 点的颜色和目标串直接相同即可。
额,所以说最后无解条件是 \(n-1\) 和 \(1\) 点颜色不能相同???????
好吧,行,容易发现确实要这样,不然确实不太能构造,除非一开始相等,于是在环上找到这样的两个点,然后标号做就好了。
操作次数大概是 \(3n\) 的。
其实已经差不多想到最后一步了,所以就算是我想出来的吧(雾)。
T6
一个 \(2^n - 1\) 个点的完全图,请你找出尽量多的不交的三元环,\(n \leq 10\)。
motivation: 分析答案上界
solution:
Offcial Solution
考虑答案上界,显然为每条边都出现在一个三元环中,也就是 $\dfrac{(2^n-2)(2^n-1)}{6}$,不难发现一定是个整数,因为每两个整数中有一个是 $2$ 的倍数,每三个整数中有一个是 $3$ 的倍数,而 $2^n$ 不会是 $3$ 的倍数。把所有 \(x \oplus y \oplus z = 0\) 的三个点取出一个三元环,显然这些三元环是两两不交的(固定任意一条边,另外两条边可以唯一被算出)。
显然 \(x, y, z\) 不会相同,每个三元环都会被统计 \(6\) 次,因此三元环个数为 \(\dfrac{(2^n-1)(2^n-2)}{6}\)。
T7
\(n\) 个数字,\(m\) 个关系表示 \(u\) 和 \(v\) 中的较大值和较小值是多少。
给出一组合法方案,\(n\) 个数字满足 \(m\) 个关系,\(n,m \leq 10^5\)。
motivation:诈骗题
solution:
My Solution
这东西可以求出每个数字取得最大值和最小值,显然有一种合法方案是每个数都取的最大值或者最小值。然后如果是较大值关系,那么强制某一边取最大值,否则强制某一边取最小值。
然后跑 \(2-sat\) 就完了。
T8
有一颗 \(n + m\) 个点的 DAG,有 \(n\) 个入度为 \(0\) 的点,初始时这些点的权值为 \(a_1, a_2, \dots a_n\)(均为 \(0,1\)),每个其他点的权值为两个子节点权值的与非(即先取 and 再取反)。
但是初始权值是不定的,你可以钦定若干个叶节点的权值,需要满足:
-
没有被钦定的叶节点全取 \(1\) 时,根节点的值和所有叶节点全取 \(1\) 时相同。
-
没有被钦定的叶节点全取 \(0\) 时,根节点的值和所有叶节点全取 \(0\) 时相同。
你要钦定尽量多的叶节点的权值,使得它满足这个条件。并给出方案,\(n \leq 10^5\)。
motivation: 鬼啊
solution:
Offcial Solution
首先答案上界肯定是 $n$,这个东西可以预处理出来然后判一下叶节点全取 $0$ 和 $1$ 的时候判断一下是否可行。日了,为啥我连这个都想不到。
否则的话我们考虑,你从一个值变得另一个值中间一定存在一个前缀 \(i\) 使得突然和与全 \(0\) 相等变到和全 \(1\) 相等,反正值只有两种。
你二分找到这个位置,这样的话你只用钦定这一个节点的值就好了。
于是这个情况的答案为 \(n-1\),太抽象了。