构造题选做

集训拉的题单,随自己听课进度和思考进度更新(

题目标号和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\) 大的数。

考虑选了最小的和次小的之后的两个影响:

  1. 比最小值更小的就不能选了
  2. 在最小和次小之间的都不能选

然后从第二条入手,你智慧的想到把序列分成 \(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\) 时,根节点的值和所有叶节点全取 \(1\) 时相同。

  2. 没有被钦定的叶节点全取 \(0\) 时,根节点的值和所有叶节点全取 \(0\) 时相同。

你要钦定尽量多的叶节点的权值,使得它满足这个条件。并给出方案,\(n \leq 10^5\)


motivation: 鬼啊
solution:

Offcial Solution 首先答案上界肯定是 $n$,这个东西可以预处理出来然后判一下叶节点全取 $0$ 和 $1$ 的时候判断一下是否可行。

日了,为啥我连这个都想不到。

否则的话我们考虑,你从一个值变得另一个值中间一定存在一个前缀 \(i\) 使得突然和与全 \(0\) 相等变到和全 \(1\) 相等,反正值只有两种。

你二分找到这个位置,这样的话你只用钦定这一个节点的值就好了。

于是这个情况的答案为 \(n-1\),太抽象了。

posted @ 2022-08-24 11:05  Pitiless0514  阅读(106)  评论(0编辑  收藏  举报