Ad-hoc 题目总结
明天补双序列。
这是一年前写的:https://www.becoder.com.cn/article/14590。
现在我在其基础上,再补充这一年做的一些新题。
力推:https://www.cnblogs.com/rainybunny/p/15398779.html。
我先逗大家乐一下:
Ad-hoc 题可能不一定能找出实力最强的选手,但一定能找出最适合做出题人 npy 的选手。
属于“思维体操”,做之前会异常兴奋,做之后会只想睡觉。
1 总结
Ad-hoc 是对一类特殊题目的统称,包含构造。这类题目往往没有套路的方法。考察选手的观察力和思维力。
1.1 利用特殊性质
在这类题目中,挖掘特殊性质是关键。有时候出题人会给你特殊性质,那么请不要犹豫。因为出题人通过特殊性质,已经把解题的道路给你铺开了。绝大多数题目都是这样组成:
-
首先你要会特殊性质的做法。然后你需要想办法再进行操作,使得题目的约束简化成特殊性质的约束。2.1 2.5。
-
你要会 A 和 B 性质分别怎么做。如果你知道把 AB 结合起来该怎么做,正解就出来了。2.2。
1.2 快速找到性质
虽然这类题很容易被天赋哥拉开差距,但我们仍可以总结一些常用的技巧来快速地“注意到”某些关键性质和突破口。
-
操作在何时一定成立 / 不成立。或者哪些东西是恒变的 / 恒不变的。
- 2.1 中,当
,或 时一定有贡献。 - 2.2 中,长度为 2 的不相同字符一定不回文。
- 2.4 中,
一定会作为一个字串地最大值。 - 2.6 中,不同颜色地两点间有环时一定满足。
- 2.10 中,当
时一定交换 , 类似。 - 2.11 中,数
在 Task1 中不会带来变化;Task2 中会让所有后面的所有前缀积积变成 0。 - 2.12 中,
的数一定不影响。
- 2.1 中,当
-
题目给的范围 / 上限为什么这么奇怪?
- 2.1 中,
上界是 ,用来构造什么的? - 2.3 中,
上限比 大,是不是要询问很大的 ? - 2.10 中,为什么
可以取到 级别? - 2.5 这个上界比较奇怪。但也可以提醒我们将
构造地不要太大,控制在和 一个数量级。
- 2.1 中,
-
首先尝试直觉 / 最简单的构造 / 方法。能否通过调整使之满足限制 / 有解?
- 2.7 中,肯定构造菊花图,具体怎么生成?
- 2.11 中,Task2 能否就让前缀积顺序取
? - 2.12 中,可以把
相同的放在同一层。让 放在奇数层, 放在偶数层。如何结合?
-
考虑枚举第一步。接下来的问题是否更简单了?
- 2.9 中。
- 2.14 中,枚举第一步是左还是右就划分成了两个栈的问题。
2 例题
2.1 P11277 世界沉睡童话
构造一个长为
正整数序列 ,满足恰有 组无序正整数对 ,满足 是 的倍数。你需要保证 。
部分分:
; 。
先考虑
我首先想到:构造一系列类似
但是这样细节比较多而且没有很快的找
让
注意到题目没有让所有数不同。很快地想到等效构造:
如何使得这些
到这里就解决了
一个观察:如果一个数对中有
每向序列中加入一个数
一直加入
此题的思考方向:
2.2 P11190 「KDOI-10」反回文串
给定一个长度为
的字符串 ,你需要把 分成若干个非空子序列,使得每一个子序列都不是回文的,并最大化划分成的子序列数。
特殊性质 A:保证
是偶数,且 中每个字符的出现次数都不超过 ;
特殊性质 B:保证中仅有 a
和b
。
突破口:长度为 2 的不相同字符一定不回文。
特殊性质 A:直接构造所有子序列长度为 2。问题变成找到 aba
类似的回文。
其他情况下会有一个绝对众数
如何避免剩下这个字符串是回文的情况?想到:把不是
此题的思考方向:A,B -> 正解
2.3 P11145 「SFMOI Round I」Strange Homura Game
未知,你需要询问不超过 2 次来确定 。每次询问给出 ,返回 的值。
一个性质:当
所以可以二分
注意到
又一个性质:
事实上,这样的
不妨先询问一次得到:
所以第二次询问必定会返回
此题的思考方向:先询问使得
2.4 P11132 【MX-X5-T4】「GFOI Round 1」epitaxy
构造一个
阶排列,使得排列中:“所有的 个长度为 的连续子串内最大值的最大公因数”最大。
突破口:最大值。
必然有一些子串的最大值是
先判掉把
我们肯定希望这个 gcd 是
首先我们需要所有子串的最大值都是形如
然后我们只需要把剩下的数放进去,并且使得他不是任何一个子串的最大值即可。从小到大放就可以了。
为什么这样一定可行,首先由于
举例:
当
注意标星号的位置,看看他们是不是完全包含了所有子串的最大值。
此题的思考方向:最大值 -> 枚举
2.5 P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题
给定正整数
,构造三个正整数 使得 。你需要保证 。
部分分:
。
首先尝试:
自然地想到让
自然考虑 其它做法留给打表哥。
类似 P11277 的思想:能不能回到
把
不难证明后面的 lcm 的结果是:
显然
此题的思考方向:数学直觉 先确定难搞的 gcd,考虑 lcm -> 发现构造只满足
2.6 P11022 「LAOI-6」Yet Another Graph Coloration Problem
小 R 有一张
个节点和 条的边简单无向图,节点的编号依次为 。她想要为图中的每个节点分配黑色或白色的颜色,使得:
- 有至少
个黑色节点和 个白色节点; - 对于任何一对点对
,只要 和 的颜色不同,就存在至少 条从 到 的不同的简单路径。
突破口:至少 2 条路径。想到构造一个环(
我们发现如果这个图没有环一定无解。
一个环把整个图划分成了若干个不相关的子图,我们想到让每个子图颜色相同。这样内部就不用管了。
考虑结合起来,环上每个点的子图交替染色即可。
考虑一种特殊情况:环上一个点
让这个子图和
容易证明这样构造合法。上述情况本质上是环上接了另外一个环。
此题的思考方向:参照环 -> 环外所有子图内部染相同颜色 -> 结合起来交替染色。
2.7 P10678 『STA - R6』月
给定正整数
和每个点 的度数 ,你需要构造一棵树,最小化其直径。
很容易想到菊花图的构造方式。麻烦的是对于每个点的度数的限制。
猜想:按照度数从大到小,依次接入点。
证明即构造:希望尽可能地使层数浅的点更大。
模拟是简单的。
此题的思考方向:菊花图 -> 贪心/证明
类似题:CF1092E
给定一张图,由若干森林组成。请给这张图再添加若干条边,使得这张图变成一棵树,且树的直径最小。
解:求出每个树的直径中点,并都接到其中一个中点上去。枚举接哪个中点即可。
2.8 P9915 「RiOI-03」3-2
给定一个正整数
。将 中每个整数的二进制最低 位从低到高依次写在一个 的矩阵上。矩阵两维的下标都从 开始。 给定 次询问,每次询问这个矩阵下标为 的格子所在的四连通块大小对 取模的值。下图是 的情况:
说实话没什么突破口,尝试打一个大一点的表。
性质:所有连通块的右边界都是整齐的一列。并且都存在一行使得最左边是第 0 列。
证明可以考虑从
打表还可以发现每个连通块不同列都是
暴力人人都会:直接向右枚举
观察数据范围:
此题的思考方向:打表发现性质 -> 找到询问点的右边界 -> 观察数据范围优化算法。
2.9 P9870 [NOIP2023] 双序列拓展
2.10 P9347 似曾相识燕归来
给定一个长度为
的排列 。现在可以进行至多 次如下操作:
- 选定三个整数
满足 ,如果 ,交换 ;否则交换 。 构造方案使得
都有 。满分限制: 。部分分: 。
提醒:此题需要分讨多种情况,请预留充足的时间。
避免被 corner case 卡,先特判
发现操作没有规律,不妨先固定一位:先让
接下来我们只需要操作至多
现在问题变成:如何通过
观察操作,我们希望让
如果存在
如何操作使得
后面的构造就比较繁琐和考验耐心了,也并不容易。这里就不展开了。笔者被恶心到了。
此题的思考方向:
2.11 P3599 Koishi Loves Construction
Task1:试判断能否构造并构造一个
阶排列,满足其 个前缀和在模 的意义下互不相同。 Task2:试判断能否构造并构造一个
阶排列,满足其 个前缀积在模 的意义下互不相同。
突破口:数
都先把
Task 1:
这说明一定有
回到构造上,看看直接构造前缀和为
考虑反复横跳。这是我编的,但这个构造方法真的很常用。发现构造
感性理解可以把每一对
Task 2:
类似地,数
接下来的构造非常清新:逆元。
不妨先设
很容易证明这样子构造的
但事实是,当且仅当
此题的思考方向:特殊值
2.12 AT_hitachi2020_c ThREE
给定一棵树,要求构造一个排列
,使得:对树上的每一对点 ,如果这两个点之间的距离为 ,则 和 中至少一个为 的倍数。
看到距离为奇数尝试按深度奇偶来做。
若
注意不一定非要把 1 放奇,2 放偶,因为他们之间的距离是奇数但不一定是 3。所以优先肯定考虑的是:让一个值(1/2)能在一个深度被分配完。满足这个的时候,才需要让他们奇偶不同。后面就在剩下的地方放 0 即可。
证明省略。
可以用 vector
维护深度奇偶的点集,每次取 back 并弹出即可。
此题的思考方向:发现 1 和 2 结合以及 3 的特殊性 -> 按照奇偶进行构造。
2.13 CF1990C Mad MAD Sum
很多题目都满足一个性质:操作若干次后恒不变。根据这个可以秒掉一堆 Ad-hoc 题。这个题虽然只有 *1500,但其每次操作都有一定的变化,只不过变化是有规律的。较前面那种纯模拟题要有趣一些。
打表发现:原数组操作常数次后形态变化稳定。
于是先暴力操作常数次,然后观察后面每次操作如何变化。
自己构造一组数量级在 10 左右的数据并打表,发现每次数的种类和相对位置不变,整体向右平移 1,超过
然后就可以统计贡献了,这个不是本题的难点。
此题的思考方向:操作若干次后数组稳定 -> 观察每次操作的变化 -> 维护贡献。
2.14 P7915 [CSP-S 2021] 回文
给定正整数
和长为 的序列 ,在这 个数中, 分别各出现恰好 次。现在进行 次操作,目标是创建一个长度同样为 的序列 ,初始时 为空序列,每次可以进行以下两种操作之一:
- 将序列
的开头元素加到 的末尾,并从 中移除。 - 将序列
的末尾元素加到 的末尾,并从 中移除。 我们的目的是让
成为一个回文数列。输出字典序最小的操作方案。
容易发现每次操作确定后,其对应的第
不妨枚举第一步选左边还是右边的元素。并找到相同元素的位置
每次只能选
字典序最小是很好模拟的,只需要分讨 4 种情况。无解也不难判断。
此题的思考方向:一次操作确定了第倒数次操作 -> 枚举第一步操作什么 -> 划分成双栈问题,再模拟。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!