task21
[TOC]
1. QOJ11623 - Construct Point [E]
题面
题解
Flamire 做法
Sol
判断是容易的,使用皮克定理计算面积比较即可,但是这对解决这个题并没有什么用。
将三个点按照横坐标排序,拆成两部分,对于一边的情况,相当于我们有两个分数满足
这个可以在 Stern-Brocot Tree 上实现,细节略为繁琐,复杂度
题解做法
Sol
取整数
那么我们就可以通过拉伸操作,把原三角形
首先,我们将
然后,我们将
再使用一些翻转方式将
此时这个三角形若不包含
2. QOJ11622 - Colorful Doors [E]
题面
有一段长为
当你在第
你会从第
现在给定一个长为
题解
Sol
认为
那么不难发现,11 门只能内部连,00 门只能内部连,10 门必须连 01 门,因此奇偶性不对可以直接判掉。
00 门内部连显然怎么连都无所谓,随便连即可。
我们需要让 11 门和 10 门的连接方式使得所有 1 的位置都连通。
可以发现,当 11 门的数量是
否则,11 门的数量是模
因此,我们一定要在连 10 门的时候,把某些 11 门独立出来形成一个环,而可以发现只要我们将 11 门拆成了一个链和一个环之后,可以分类讨论环长模
实现即可。
3. QOJ10871 - Joy of Sushi [E]
题面
给定一个长为
- 对于
,令 - 将
分别循环右移一位
求最少多少轮操作之后所有
题解
Sol
想办法固定
对于
而对于
因此,我们可以定义一个序列
可以发现,一个整周期的效果相当于给所有
定义
转化为相邻项
对于模
4. QOJ10862 - Advanced Evolution Studies [E]
题面
给定正整数
- 其点数在
内 - 对于每个限制
,都有 是 的严格子孙
题解
Sol
注意到我们可以使
把这棵树看成从一堆单点合并成全集的过程。正着操作的影响不好描述,因此我们考虑倒过来。
每个限制相当于合并出
倒过来就相当于我们需要将全集拆成若干个小集合,而拆一个集合
- 若对于某个限制
,满足 ,则 必须划分到同一个小集合内,且如果 在同一个小集合内,那么 必须都在同一个小集合内
而注意到把集合拆的更碎一定不会更劣,因此我们进行如下过程:
- 初始将
中每一个元素划分为一个小集合 - 将所有
的小集合合并 - 如果当前有某个限制的
在同一个小集合内,那么将 的小集合合并
最后如果得到的是全集,那么一定无法合法分割,返回无解,否则递归进行
第三步可以使用启发式合并,每次合并探测更小的那边的所有连边,复杂度
5. QOJ10697 - Judge Error [E]
题面
给定一个
题解
Sol
画一画可以发现看起来一个点双如果有完美匹配,则一定不唯一
可以发现这可以推出边双的完美匹配不唯一:我们建出圆方树,可以根据子树点数奇偶性判断每个割点要跟哪边匹配,我们把这个看成一个方向,那么一定存在一个所有相邻的方向都向内的点双,这个点双必须是一条边,这意味着图想要有解必须存在割边
这也为我们提供了一个对有解的图构造解的方式:我们每次找到任意一条割边,根据两边连通块的大小奇偶性判断是这条边是直接匹配还是删除,如此递归即可构造
朴素实现即为
6. QOJ10693 - Flappy Bird []
题面
二维平面上有一个高为
有
求
题解
Sol
同 ARC001D,摘录一下题解。
称
从起点出发,走出一个上边界
如果加入某个障碍后
可以使用双端队列
7. QOJ10688 - AmazingTalker [E]
题面
给定
要求构造方案边数不超过
题解
Sol
意义不明。
画到二维平面上,如果两个点为左上-右下的关系的话,在不考虑边数限制的情况下连上它们一定是不劣的,称这样的边为实边,其余边为虚边
进一步发现,不会有一条长为
因此,连完所有实边之后,设一个点的度数为
只需要判断每次
接下来解决边数限制的问题,一个点如果被某个
随便使用二维偏序数据结构连足够多的边即可,
8. QOJ10543 - Square Stamping [E]
题面
给定
题解
Sol
将三条线从上到下编号为
而不妨设取了一个
注意到每次
那么如果暴力转移,我们就得到了一个状态数
考虑优化,注意到我们过程中所有的状态形如
因此,我们再额外存
转移
本题还有一个记忆化搜索做法,即直接按照这个贪心执行,记忆化所有状态。出题人在题解里声称这是
目前我还没有找到任何有道理的证明,个人倾向于这个实际上是没有道理的,只不过不好卡。
9. QOJ10083 - Single-Crossing [E] ⭐
题面
给定
给出构造或判断无解
题解
Sol
如果我们确定了
这个也是可以检查的,我们将条件重新表述为:对于每个值
这个可以扫描线+树状数组维护最值解决,因此我们固定
接下来,我们就是要求出
有若干种方式求出
考察一对
,如果 和 的相对关系都出现了,那么我们可以将其分为两个集合 ,第一次时可以任意将一个集合放在前面,而递归下去之后必须要判断在外面大小关系,决定要把哪个放在前面 找到一对相对关系改变的
可以任意选两个排列 ,找到它们第一个不同的位置 但我们找到
的层数可能很大,复杂度退化为 我们选取
时采用随机,在最终的 中 和 有 的概率都在此时集合的前 ,这样能保证期望 次之后就能将问题规模除以 ,不符合概率判断无解即可 也是优化上面的过程,观察我们不一定要找到
,只要我们找到任意一个 ,并且我们划分开哪些排列是 ,哪些是 ,分别运行上面的 check 算法即可。因此,我们在上述的分裂算法中,每次走小的一边即可 对两个排列
,定义为 的逆序对个数,也可以视作将 和 排成一排,将相等元素之间连线的交点数 可以发现如下结论:
,证明可以考虑上述画线的理解,右式即为计数所有折线之间的交点数,而由于任意两个元素代表的折线只会相交一次,所以这就直接等于所有元素的交叉次数 因此,我们任意固定一个排列
,找到与其 值最大的排列,其一定为 或
总复杂度
10. CTT2023 - 士兵游戏 [E]
题面
构建一棵
求
题解
Sol
考虑每条边被贡献了多少次,转化为统计子树大小。
对于一个数
枚举
当
因此我们的流程就是:枚举一个
因此,我们需要处理出
但
注意到
枚举
那么此时我们就得到了一个
进一步地,可以发现我们在枚举到
复杂度:
- 当
时不超过 - 当
时不超过
积分一下可以得到枚举量级为
因此总复杂度为
11. CTT2023 - 解谜游戏 [E] ⭐
题面
交互题,有一个隐藏的
你需要在
题解
Flamire 做法
Sol
没有什么出发点,考虑随机直到找到错排为止。根据某些结论,期望随机
但手玩一下可以发现有一个错排之后还是有些困难。直观感受可以画到一个矩形上,
那么一个错排相当于我们排除掉了一条斜线,但在此基础上构造别的结构依然比较困难。
因此我们可以考虑随机直到
这时,我们交换
也就是说,此时我们可以选出一个
那么二分即可,一个环可以拆成三个独立集,询问次数是
提交记录做法
Sol
考虑随机出一个错排。在错排上交换两个位置
而可以发现,我们也可以找出一些互不影响的交换,然后得到它们的询问的和
换个方式重新表述一下我们的问题:现在有一张完全图,每次询问我们可以询问一个匹配中有多少条边,还原一个置换环图
那么解决方式就比较显然了,一个完全图可以拆成
询问次数
12. QOJ10045 - Permutation Recovery [K] ⭐
题面
给定一个
现在给定一个
题解
Sol
将点
如果这张图是二分图,我们就知道一定可以拆成
如果
那么我们可以尝试去给每个点匹配前驱和后继,我们把每个点拆成入点
但是这样有一个问题:对于一条边
如果我们能对这个图定向的话,也许就能匹配了。
因此我们求出欧拉回路,将所有边按照欧拉回路定向。按照上述方式建出来的图是一个
因此这时我们跑一个二分图边染色,就能解决所有问题了。
复杂度
- Title: task21
- Author: Flamire
- Created at : 2026-01-11 00:00:00
- Updated at : 2026-01-21 14:57:08
- Link: https://flamire.github.io/2026/01/11/task21/
- License: This work is licensed under CC BY-NC-SA 4.0.