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
将点
如果这张图是二分图,我们就知道一定可以拆成
如果
那么我们可以尝试去给每个点匹配前驱和后继,我们把每个点拆成入点
但是这样有一个问题:对于一条边
如果我们能对这个图定向的话,也许就能匹配了。
因此我们求出欧拉回路,将所有边按照欧拉回路定向。按照上述方式建出来的图是一个
因此这时我们跑一个二分图边染色,就能解决所有问题了。
复杂度
13. QOJ10037 - Build Well [E]
题面
给定
求是否存在两种把这些圆弧拼成一个完整的长为
题解
Sol
如果我们选择了一些元素和为
否则,长为
也就是说,
而求最小凑出的个数仍然不太好算,我们再观察一下:
- 如果存在某个长度
,使得 ,那么我们只用 和 即可,进一步发现除了 和当 为奇数时 ,其余 均满足条件 - 而如果不满足上述条件,可以发现我们也可以先选一个
,再选尽可能多的 ,最后最多剩一个 - 如果
是偶数,我们也可以全选 - 否则,显然我们不存在一种方式满足
而这时每种凑出
14. QOJ10007 - Holes in Queue / CF1060G - Balls and Pockets [E/K] ✔️
题面
有一个无限长的序列
Holes in Queue:所有
Balls and Pockets:无特殊限制
题解
Flamire 做法(仅限 Holes in Queue)
Sol
这个操作看起来非常难维护。
因此我们换一个方向考虑,会被
那么我们就得到了一个求一个数最后排名的算法,倒过来可以变成从排名求数的算法
我们现在的过程为:顺序扫
考虑观察一下这个询问,可以认为我们每次操作分成了
具体地,假设我们在
这样我们就能快速执行矩形的移动,使用平衡树维护列的插入,精细实现一下可以发现这个想法是可行的,可以做到复杂度
Holes in Queue 题解做法
Sol
与上一个做法比较类似,但我们不维护一个移动的矩形,而是直接把所有数框进一个矩形
称插入的空数为
接下来每次操作,操作
此时按照左上到右下的顺序(先右再下,即正常人类阅读顺序)读出所有
每一列最多分为三个段,因此总共行只有
可以发现这个做法非常难写,尽管和上面的做法可能本质相同
复杂度
Balls and Pockets 题解做法
Sol
返璞归真一下,定义
分析
一下操作均指进行一次
我们产生一个想法:能不能对这些元素分一个段,使得每个段操作完恰好会移动到下一个段,这样迭代
事实上,这是可行的,我们以
接下来我们需要解决段内定位的问题,顺着搞虽然有可能可行,但还是比较麻烦,我们倒过来考虑。
选取一个足够大的
这样我们从后往前移动这个区间,初始维护一个集合
而对于一个询问
跑两次上述算法即可,维护可以使用树状数组,复杂度
15. QOJ10003 - Decorative Birds [E]
题面
有
现在你手里有一些饲料,每当你投放一单位饲料之后此时出现的速度最快的鹅会吃掉这个饲料,提供
你可以随意在任意时刻投放任意多的饲料,你需要最大化收益和
题解
Sol
把所有鹅画到二维平面上,画成
考虑分开,我们找出所有没选的线段,一定不能有一个选的线段被没选的线段完全盖住
因此我们画出没选的线段的遮挡出的轮廓线(类似直方图),然后对这个轮廓线考虑
我们试图在这条轮廓线上 dp,令
那么我们就直接得到了一个
考虑优化,可以注意到我们只需要处理如下两种转移,其余转移可以直接丢弃:
- 当前横坐标出现了一个线段左端点,这个端点下方的状态转移到在这个端点
- 当前横坐标出现了一个线段右端点,这个端点转移到所有这个端点下放的点
对
- 求前缀
,单点修改 - 对
的每个 ,执行
可以使用线段树维护,复杂度
16. QOJ8559 - -coloring [E]
题面
给定一张
最后每条边都要被染黑,给出构造或判断无解
题解
Sol
摘抄一下题解做法。
当
当
当
当
17. QOJ8012 - Jumping Lights [E] ✔️
题面
给定一棵大小为
0 u,将一个点染为白色(如果已经是白色则什么都不做) 1 u,将一个点染为黑色(如果已经是黑色则什么都不做) 2,对于树中所有点,这个点操作后是黑色当且仅当操作前其所有邻点中至少有一个黑点
每次操作后,求出此时树中有多少个黑点
题解
Sol
可以发现这个操作有类似奇偶循环一样的东西。
不妨 2 操作不会让黑点变成白点,即我们点一个黑色点之后,这个点随 2 操作不断向外扩散
这个我们是可以做的,维护:
- 至少有一个黑儿子的白点集合
- 至少有一个白儿子的黑点集合
- 每个黑点的白儿子集合
一次 2 操作时,我们将所有 2 操作时我们的复杂度是关于新染黑的白点个数线性的
而 01 操作对这些集合的影响都是
但现在有奇偶循环。
我们把树拆成两层,点分别表示为 2 操作时我们将逻辑改为:
- 将
层的点向外扩散一步 - 令
01 操作的逻辑改为:
- 将
在 层的点置为黑/白
但是这样会有一定问题,比如某个点 2 操作后它的所有邻居 0 操作让 2 操作,可以发现此时
这是因为,当层改变时,若此时层为
可以注意到上述出问题的情况只有可能是
但是这样的复杂度仍然是不对的:我们可以造一个菊花 2 操作后 0 操作染白,然后再进行一次 2 操作,此时
这意味着我们的均摊分析爆炸了。我们修改的次数可以达到
我们需要规避这个问题。当我们进行 0 操作时,我们直接将父亲也染成白色,这是对的,因为我们多染一些点不会让答案错误。此时错误的情况就只有孤立点是叶子的情况,也就是上面的
那么最后我们的做法为,维护:
- 至少有一个黑儿子的白点集合,按照层分类为
- 至少有一个白儿子的黑点集合,按照层分类为
- 每个黑点的白儿子集合
0 操作时进行:
- 更新上述三个集合,当
为叶子时可能需要精细特判 - 将父亲染黑,将挂在
上的叶子点染黑
1 操作时进行:
- 更新上述三个集合,当
为叶子时可能需要精细特判
2 操作时进行:
- 使用
和 中的点染黑新点
可以发现,01 操作的时间复杂度都是严格 2 操作的时间复杂度关于染黑点数线性
因此总复杂度为
- Title: task21
- Author: Flamire
- Created at : 2026-01-11 00:00:00
- Updated at : 2026-02-03 11:40:38
- Link: https://flamire.github.io/2026/01/11/task21/
- License: This work is licensed under CC BY-NC-SA 4.0.