构造做题笔记

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\) 的情况:

\[..BABABABA\\ ABBABAB..A\\ ABBA..BBAA\\ A..ABBBBAA\\ AAAABBBB..\\ \]

进一步,我们尝试去归纳 \(n\) 更大的情况,我们发现可以这样做:

\[..BABA [(n-4) \times BA] BABA\\ ABBABA [(n-4) \times BA] B..A\\ ABBA.. [(n-4) \times BA] BBAA\\ ABBA[(n-4) \times A + (n-4)\times B]..BBAA\\ A..A[(n-4) \times A + (n-4)\times B]BBBBAA\\ AAAA[(n-4) \times A + (n-4)\times B]BBBB..\\ \]

刚好 \(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

先手玩样例盲猜答案是最高的二进制位。

然后我们考虑到题目要求等价于都是二分图,容易想到把点分成一半互相连边,然后内部递归即可,折原可以构造出解。

可以直接暴力算,不过题解给的构造更巧妙,直接连最低为数码不同的位置即可。

CF1515F Phoenix and Earthquake

posted @ 2024-07-31 12:40  rlc202204  阅读(16)  评论(0编辑  收藏  举报