构造做题笔记
UOJ460 新年的拯救计划
\(n\) 点完全图。选出尽量多生成树。输出方案。 \(n\le1000\)。
考虑上界,总共有 \(\frac{n(n-1)}{2}\) 条边,也就是最多可以分成 \(\frac{n}{2}\) 棵树。
尝试证明这个上界可以达到。我们考虑归纳法,假设 \(n = 2k\) 可行。
考虑 \(2k + 1\),我们可以将每棵生成树选一个不同的点连向 \(2k + 1\),考虑到只有 \(k\) 棵,显然是够的。
考虑 \(2k + 2\),由 \(1 \sim k\) 连向 \(2k + 1\),\(k + 1 \sim 2k\) 连向 \(2k + 2\),然后再加一棵生成树,由 \(1 \sim k\) 连向 \(2k + 2\) 和 \(k + 1 \sim 2k\) 连向 \(2k + 1\),同时连 \(2k + 1\) 和 \(2k + 2\)。
这是一个构造的方法。这题就完了。
CF1558C Bottom-Tier Reversals
首先观察性质:位置的奇偶性不会改变,所以如果一开始奇偶性就错了肯定不行。
接着我们需要确定一个大体思路,如何做排序?由于是对前缀操作,我们考虑倒着往前一步步还原。
所以我们现在先考虑如何把最后两个变成 \(n - 1, n\),观察最终的长度约束,如果我们能在 5 步内完成,那么这个问题就解决了。
第一步:找到 \(n\),使其变成第一个。
第二步:找到 \(n-1\),使 \(n\) 变成 \(n-1\) 前面的元素。
第三步:翻转使得 \(n-1\) 第二个,\(n\) 第三个。
第四步:翻转使得 \(n\) 第一个,\(n-1\) 第二个。
第五步:翻转使得 \(n\) 最后,\(n-1\) 倒数第二。
然后就顺利解决了这道题。
P6892 [ICPC2014 WF] Baggage
神仙构造。
首先看到这种题肯定是要手玩小数据并且猜下界,根据样例不难猜出下界是 \(n\)。
证明下界分两步,首先是证明不存在更小的,其次是构造一个。
我们先考虑证明不存在更小的,观察题目的性质发现,如果我们记相邻两个位置相同的个数为 \(\phi\),则我们从 \(0 \to 2n-1\),由于每次最多新增两个且第一次最多新增一个,所以至少 \(n\) 次。
根据这个,我们可以手玩出 \(n = 4\) 的情况:
进一步,我们尝试去归纳 \(n\) 更大的情况,我们发现可以这样做:
刚好 \(n\) 次,但是这里要求存在使得只往前移两位的方法,所以 \(n-4 \ge 4\),意味着我们需要自己手玩 \(n = 3,4,5,6,7\) 的情况。
毛虫树
一棵毛虫树(有一条链,所有点到这条链的距离不超过 \(1\)),编号 \(1 \sim n\),使得每条边 的权值为 \(1\sim n-1\),边权 \(=\) 两端点标号的差的绝对值。
考虑递归,我们每次取最右边的点变成 \(n\),然后将其周围的点赋 \(1,2,3,\dots, k\),然后下一个点变成 \(n - k\),周围的点赋值成 \(n-1, n-2, \dots\),这样就可以递归地解决这个问题了。
[AGC041C] Domino Quality
很神啊。
由于是每行每列都有要求,这种时候我们可以尝试对角线!!!
如果我们能解决 \(k\) 大小的问题,并且 \([k + 1, 2k)\) 都有一样的解,我们沿着对角线分即可。
这里试一下发现 \(k = 4\) 时是可以的,于是就做完了!
P9820 [ICPC2020 Shanghai R] Mine Sweeper II
不理解这题普及-是谁给的。鸽笼原理。
首先遇到这种 \(\frac{m}{n}\) 的分数的时候可以考虑:有 \(n\) 种可能的方案,且操作次数总和为 \(m\)。
于是我们考虑构造两种方案使得涉及格子的总数为 \(nm\),这就不难想到将 \(A\) 的所有格子取反作为一种方案,我们可以证明数字和与 \(A\) 是相同的,通过任意两个格子之间的关系得出。
然后就没了,但这题绝对不止普及-。
CF1450C2 Errich-Tac-Toe (Hard Version)
和上题类似,我们需要找到三个方案。
考虑如何使平局,启示我们可以运用模 3 的余数分类。
所以我们可以让每次选定两个个余数,使第一个余数没有 O,第二个没有 X 即可。
2/3区间覆盖
区间 \([0,1]\) 上给定了一些区间,这些区间的并覆盖了 \([0,1]\)。
选出若干个区间,使得 \([0,1]\) 区间上恰被 \(1\) 个区间覆盖的地方 的长度 \(\ge \frac{2}{3}\)。
我们考虑去掉能去掉的所有区间,使得最后的并保持不变,这样按照左端点排序等于右端点排序,且没有一个部分覆盖超过两次。
然后我们取所有区间,奇数区间,偶数区间,不难发现至少覆盖的是 \(2\),根据鸽笼,我们解决了这道题。
Fixing Networks Gym - 103119F
这种题目我们首先需要想一些必要条件,然后尝试证明其也是充分的。
我们发现一个必要条件:\(c(d + 1) \le n\),其实这也是充分的。
我们考虑归纳,如果 \(c > 1\),我们只用将 \(d + 1\) 个点连成完全图即可。
如果 \(c = 1\),我们可以连成一个环,然后在环上再连边即可。
CF1163E Magical Permutation
好题。被我切了。
我们考虑性质,我们发现由于原数组互不相同,也就是差分数组的前缀和互不相同,这意味这我们需要用给定集合的一个子集表示所有的数。所以我们大胆猜结论:如果线性基中前 \(k\) 位都不为空 \(2^{k+1} - 1\) 就是可行的,并且所用到的数不能大于等于 \(2^{k+1}\)。
必要性显然,现在我们尝试构造一组解,我们考虑递归的思路,我们先把左边构造一种 \([0, 2^{k})\) 的,然后翻转变成右边,但是右边的所有数需要异或上 \(k\) 的线性基的那个数,这样保证中间的差刚好再 \(S\) 中。
然后就完了,代码很短。
CF1438D Powerful Ksenia
这题诈骗啊。
显然操作不会改变异或和,然后分奇偶性讨论。奇数直接把第一个数每两个数每两个数异或上所有的,然后再重复一遍即可,偶数不为 \(0\) 显然不行,否则忽略最后一个,按照奇数的来就行了。
好唐啊。
AT_jsc2019_qual_d Classified
先手玩样例盲猜答案是最高的二进制位。
然后我们考虑到题目要求等价于都是二分图,容易想到把点分成一半互相连边,然后内部递归即可,折原可以构造出解。
可以直接暴力算,不过题解给的构造更巧妙,直接连最低为数码不同的位置即可。