【做题笔记】CF 1400-1600 构造题
本人比较菜,所以做的 rating 很低/kk/kk/kk
欢迎各位大佬嘲讽这个蒟蒻/kk/kk/kk/kk
update in 2023.10.13 哇酷真成废物了,这个题单被 Biuld 和 Million 薄纱了。
表示看了题解才过的(所以你会发现这里的大部分题后面都会有 )
实时通过率直接贴在后面
当不看题解通过率稳定在 以上就弃坑。希望早日弃坑
ABBC or BACB*
题面中给了两种操作 ,。我们发现这两种操作的本质就是将在左边的 换到 右边,在右边的 换到左边,并且消掉一个 。
因此一个 能消掉一串连续的 。我们考虑统计 的个数 和 连续的串的个数 。如果 那么显然 都能被消掉,否则就减去最小的一段 不消。
为什么是统计 B 的个数而不是连续的 B 的段数? 因为我们发现如果是这样的一个串 ,这样两边的 也能消掉,但 的段数是小于 的段数的。
AC:
Two-Colored Dominoes*
一个比较显然的结论,如果一行需要涂色的地方是奇数那么一定无解。有解的情况只需要判断 的颜色,直接依次按照 的顺序涂即可。
AC:
Kolya and Movie Theatre
没看题解过掉了,可喜可贺,可喜可贺(完了太菜了)
题面像 dp,但并不是。我们发现只要确定了最后一次看电影是在哪一天就知道要减多少个 了,再贪心的用优先队列维护最多前 个最大的正数的和即可。
AC:
Dual (Easy Version)*
找到绝对值最大的 ,并考虑让其他数的正负性都跟它一样,这需要 次操作。当都是正数或者负数的时候可以直接线性推一下,这依旧需要 操作。
AC: 1/4=
Row Major*
我们考虑隔多少位才能填一个相同的数。令这个数为 ,那么显然 不能为 的因数。又因为要求求出最少不同的字符数量,所以 越小越好,也就是等于 最小的非因数即可。
AC:
No Prime Differences
如果 为合数,那么直接从左往右,从上往下顺序填数即可,这样每两行之间差为 ,是合数。如果是质数的话,我们考虑每两行之间为 的差即可。就可以先填偶数行 [2k+1,2k+m],如果 为奇数的话中间靠一个 连起来。
AC:
Bracket Coloring*
如果整个序列的 (
和 )
的个数不相等,那么显然是无解的。否则看看能不能给整个序列都染一个色,不行的话答案必定是两个色。稍微证明一下:
令最后需要 个颜色才能覆盖整个序列,那么显然所有满足条件 的序列可以合并起来,所有满足条件 的序列也可以合并起来,最后得出 。
令 (
值为 ,)
值为 , 表示序列值的前缀和。我们将它在函数上表示出来,会发现每当函数的正负性变化的时候,现在的颜色肯定和上一个颜色要不一样。所以求出函数与 轴的交点即可,不难发现交点满足 或 。
AC:
Flipper
第一位是一定不可能再在第一位了,所以新的第一位应该是除第一位外的最大的,令它的下标为 ,那么有两种可能
- x 为末尾,可以把 的移到后面去
- 翻转 这段区间, 作为后缀的开头成为新的开头
对于可能一,可以判一下 是否为末尾,并且 就直接翻转 这段区间。
对于可能二,我们发现最后的序列是 ,贪心的让 即可。也就是找到 左边第一个小于 的数
AC:
Search in Parallel
贪心的把出现次数多的放在遍历时间少的位置即可。
AC:
Umka and a Long Flight*
我以为是找规律,实际上是搜索。一个显然但又不是那么显然的结论就是最后边长为 和 分割成的正方形边长分别是 。
因此,就可以从大到小判断能不能放这个正方形。
AC:
Sum on Subarrays*
最近发现很多题都是想到一半有个想不出就不会了。
可以先二分找到最小的 且 。如果是等于的直接前面 个是 ,后面的都是 。否则可以前 个都是 ,第 个是 。这是因为前 个已经产生了 个子串,最后一个需要额外产生 个子串。所以它要与前面 个后缀的和是负数。
AC:
Sequence Master
首先,我们发现由于 的特殊性,所以在 时 也是一种合法序列。
接着我们考虑 是偶数的情况,这时候如果序列中有 个 和一个 也是合法的,比较容易证明。但如果 是奇数,序列中有 个 和一个 是不合法的。这是由于如果 放在乘法集合里面,这个集合的值是 ,而另一个集合的值应该是 ,除非 否则等式不成立。
最后对于所有情况,我们发现显然 是一组合法的解。由于这样合法的解并不多,我们直接暴力枚举每一种可能即可。
AC:
The Very Beautiful Blanket*
神秘的构造题
观察样例可以稍微猜测一下每个正方形里的值都差 。设左上角的坐标为 并且值为 ,那么这个 的方格异或起来应该是 。现在我们只需要让每个值都尽可能不同即可,这个只需要给 乘上 。
AC:
Unforgivable Curse (easy version)
首先可以判断一下s和t中的字符数量和种类是不是都相等,然后大胆假设如果 能动,那么是不是x就可以交换到任意位置了呢?
相差 的位置可以先交换 ,再交换 。剩下的证明 可以由若干个 相加得来。令 ,那么可以先丢 个 ,剩下要么还差 ,要么差 ,显然是可行的。所以可以得证。
因此当 的时候是一定有解的,因为此时无论是哪个位置都可以动。特判一下 的情况即可。
AC:
Unforgivable Curse (hard version)
写完简单版本其实这题也不难。依旧证明 可以由若干个 相加得来。令 ,就先放 个 $$k,剩下的应该是 ,也就是证明 可以移动出来。
因为 是可以移出来的,任意数都只要移出若干个 即可。所以这个结论是成立的。因此当 一定有解,剩下的特判即可。
AC:
Heavy Intervals
好像中间有几题写了没贴上来?无所谓不管了
感觉很 CF 题,是很多套路的集大成题。
有个比较显然的结论,已知 ,那么 ,随便证证就出来了。所以有个贪心策略,让大的 匹配小的 。于是 也要有尽可能小的,并且小的要尽可能多,就将 从小到大排序,枚举 ,在 中间二分找到第一个大于它并且没有被访问到的数。直接弄会超时,用 CF 经典套路并查集优化一下查找过程即可。
AC:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下