task19
[TOC]
1. 北大集训 2021 - 末日魔法少女计划 [E/K]
题面
给定
- 对于所有
, - 对于任意满足
的位置,存在 满足 - 对于所有
,都有
设
题解
Sol
首先观察一下题面:可以发现这是一个数据结构问题。即初始有信息
那么具体地,按照如下方式进行问题的划分:
- 枚举一个块数
,然后平均切块,每个块内部的询问递归进去继续做,最后在外面做一个长为 ,次数 的问题
直接写 dp 即可获得 ~80pts。
优化:
- 注意到开头和结尾的两个块分别只用处理前缀和后缀,并且做整块合并的时候我们实际上只用做长为
的问题,而开头结尾和中间的块的贡献不一样,因此我们可以将它们放长一点,在 dp 转移中可以加上这一点 - 一个长为
的块预处理了前后缀,相当于我们只需要递归中间长为 的块,只预处理其中一个相当于只需要递归 的块
加上这两个优化即可通过
2. QOJ7510 - Independent Set [E] ⭐
题面
有一张未知的
每次你可以给出一个顶点序列
- 维护一个集合
,初始为空,以及一个长为 的 序列,初始所有 - 扫到
时, 会被更新为:一端是 ,另一端的端点属于 的边的数量 - 如果
,那么 会被加入
最后你会得到
你需要求出所有边,你可以询问的
题解
Sol
首先我们可以询问
然后看起来没有什么头绪,所以我们先把所有点以任意顺序一起问一遍,这时我们可以拿出来所有
因此我们产生一个想法:如果能求出这个独立集和剩下的点之间的所有连边,我们就可以把这个独立集扔掉,然后对剩下的部分继续做
由于不在独立集内的点,向独立集内的点至少有一条出边,所以我们的询问复杂度是有保障的
但是我们真正分治的时候会发现问题:如果我们要询问独立集
因此我们可以进行调整:我们一开始先不断问独立集,得到独立集序列
然后倒序处理:每次询问出
最后询问次数为
3. QOJ1884 - Mission Impossible: Grand Theft Auto [K] ✨
题面
给定一棵
设树上一共有
题解
Sol
注意到我们覆盖所有叶子需要
手玩一下这个操作,可以发现我们操作一条链
也就是说我们有一个大致的直觉是:操作的端点大概是 dfn 序上比较接近的点
再玩一玩,可以发现按 dfn 序排序为
但是这种构造方式有一种情况下会爆掉:当存在一条边使得我们某个时刻遍历完了边的一个子树,然后另一个子树还没有遍历,这时候我们就会凭空多出一个叶子,称这种边为坏边
设我们按 dfn 序操作的为
对于每一条边,设它子树内的 dfn 序为
那么我们分
为偶数,那么缩掉二度点之后最多有 条边,而这 条边中,叶子边都不会成为坏边,所以最多有 条可能成为坏边的边,因此一定存在一个 只会有不超过一条坏边,我们选取这个 ,然后操作到坏边的时候用额外的一次操作把新产生的叶子干掉,再继续操作 为奇数,那么每条边最多有一边的子树是偶数,因此每条边最多成为一次坏边,也就是说一定存在一个 只会有不超过一条坏边,我们选取这个 可以发现对于任意
,dfn 序为 的叶子的父边一定对 是坏边,所以我们按照这个方式构造,最后形成的情况就是只剩 一个叶子,用一次操作把它干掉即可
复杂度
4. QOJ1875 - Nein [E] ⭐
题面
给定
题解
Flamire 做法
Sol
做麻烦了。
令
我们对
这个问题不是很好处理,考虑对
- 当
比较小的时候,我们可以直接从高到低填,只用保留 最近 位的值,以及上一位是否借位,这部分在所有前缀之间可以共享信息,总复杂度与 相关 - 当
比较大的时候,我们可以先填 ,然后再填 ,这样一直填下去,这样我们填的时候只需要记录第一组的位的进位,以及上一组的进位情况,总复杂度与 相关
取
题解做法
Sol
令
判断
这个就好办一些了,由于答案不会太大,所以我们设答案有
确定一段前缀之后,相当于我们后面有
而注意到一共
枚举最后的和是哪个,然后进行数位 dp 算出方案数,可以提前预处理出来
这样我们数位 dp 的复杂度是
5. QOJ1874 - Goldberg Machine 2 [K] ✨
题面
有一类机器:这类机器形如一个 >v. 三种字符组成的字符矩阵,保证 .
接下来,你可以在 > 还是 v,决定是向右走还是向下走,在小球离开这个格子之后,这个格子的方向会反转,即从 > 变 v,v 变 >
小球会一直运动直到走出矩阵或者走到某个 . 为止
给定两个机器 . 的位置相同,现在你需要回答:最少往
题解
暴力做法
Sol
显然状态的历程是一个环,因此我们实际要判断的是
设我们在
而给定
我们逐位从低到高确定
考虑第
位时,我们进行预处理,初始 上放 个 ,当 个数为偶数的时候,我们两边一定可以当成平均分 ,用更低的位去处理上下取整的问题,但当 个数为奇数时,我们就需要知道 的取值,才能知道奇偶性,因此我们不知道分出去的方向是什么,我们把这后面的所有结果设为无效此时,我们只需要找到任意一个有效拥有奇数个
的格子 ,即可通过这个格子此时的取值推断出 是什么但是如果
,我们还需要更新 ,即让 ,如果将所有格子重跑一遍复杂度太高观察到我们只关心后续考虑的格子的取值,没必要更新之前的格子,而我们实际上需要改变的就是
的所有边,给这些边补上偶 数 个 奇 数 个 的权值,其余的依然满足 可以从 推过来,而这些边恰好是割掉了一个包含 的连通块向外的所有边或者说,我们可以按照一个格子最高的出现奇数次的位分类,每一类内部我们只需要在考虑完第
位后加一下值,然后递推一下,即可保证后续的值都正确
总复杂度
正解做法
Sol
对这种操作的题目,我们可以考虑能不能找一个特征值,使得这个特征值在小球移动的时候不会改变,并且我们希望这个特征值最好是加性的,这样我们每放进去一个球就是给特征值加上一个定值
如果我们当前局面为 > 用
其中
那么根据小球的两种移动方式,我们可以得到:
可以解出
我们设每个 . 和出界的位置
而小球出界之后会让特征值
我们可以发现:对于两个没有小球的局面,
若
那么接下来我们就可以注意到一些事情:
- 放一个小球相当于给特征值加上
,若设 中最大的分母为 ,那么放球的最小周期一定是 - 我们要求的实际上就是一个
使得
对于求
但是这样复杂度太高了:我们有
因此考虑随机:随机
- 此时
的分母为 的概率至少为 ,因此我们直接取这之中分母最大的作为 即可 - 并且一个不合法的
在这样的计算方式下满足 的概率不超过
我们取
取
6. 图灵杯 2025 - 旧事重提 [K] ✨
题面
有
给定
题解
Sol
类比兰道定理,我们可以得到一个比分序列
- 将
从小到大排序, ,且在 时取等
必要性比较显然,充分性可以通过构造左部
那么我们再大胆猜测一下,一个区间序列合法的条件是对于
事实上,这也是正确的。
我们只需要说明:对于所有
我们选择最大的
重新排列
由于
接下来,我们探讨
这个
- 若
,那么前缀和一定从这个位置开始下降,直到最后下降到了一个 的位置,因此在这里 不会让后面的前缀和 - 若
,那么前 个位置的前缀和 ,而由于单峰函数首尾都 ,可以说明整段
那么我们就得到了一种快速算答案的方式,只要找一下
接下来,我们考虑快速维护这件事情。
首先我们提出一种新的计算
- 将两个序列分别求前缀和得到
,答案改写为 - 我们任选一个
,强行将其从 中删除,设删完的序列叫做 ,其前缀和叫做 - 那么由于
递增,我们原来求的答案相当于 - 将
拆开: (舍弃掉出界的项) - 按照
分类: - 也就是说,我们可以直接将
中任意一个元素 删除,然后令 ,就可以转化成一个 的下标均为 的问题,一直这样递归下去到 ,答案即为 (注意这里 ,但 可能 )
我们仔细分析
单增,找到 中最后一个 的数 ,以及 中第一个 的数- 若
不存在,那么我们就是直接删除 - 若
都存在,那么手模可以发现我们的操作相当于将 都删除,并在原来的位置插入一个 - 若
不存在,那么我们就是让 加上 ,然后将 删除
因此这个修改也是可以优美地进行的。
现在回到原问题,我们要支持
可以发现,这样进入一个线段树节点时,
在同一个节点上我们可以线性更新
总复杂度
7. QOJ6545 - Connect the Dots [E] ⭐
题面
给定一个长为
要求输出最多的边数,并给出构造
题解
Sol
首先,可以转成三角剖分,最外圈的边显然能连的都连,并不影响。
随便画一画可以发现这个限制不是很强,具体地,似乎大于等于三种颜色的时候一定可以连满连出
证明:当颜色
用链表维护上述过程也可以得出颜色数
对于颜色数
具体地,设相邻相等的数量为
证明:随便连一条
这也意味着我们每次选一个
8. QOJ8086 - Cloyster [E] ⭐
题面
有一个
- 所有
为互不相同的 内的整数 - 对于每个不为最大值的
,其八连通范围内至少有一个元素大于它
给定
题解
Sol
考虑询问一条竖线,找到竖线上面的最大值
如果两边都有比
因此只有一边比
但是注意到“每个非最大值周围都有一个更大的格子”,这个性质在递归之后就被破坏了,因此我们需要进行特殊处理:
我们额外传进一个外圈上最大的位置
,并且我们已经知道这个值为如果询问的一行最大值
,那么就取 在的那一边下去递归,否则按照刚才的处理进行
横竖交替分治,我们可以用
9. QOJ964 - Excluded Min [K] ✔️
题面
对于一个序列
给定长为
题解
Sol
水平低下了。
将所有数
这个值没有什么更好的形式,因此我们考虑转变一下思路,对
但是这样我们扫的时候需要矩阵加,删除元素,查询最大值,这个不是很好做
而注意到
删除一个元素的时候,我们也可以通过线段树上二分,用
总复杂度
10. QOJ2626 - Kilk Not [E]
题面
给定一个长为 01? 的字符串 ? 填成 1,剩下的填成 0,最小化填完的 01 串中最长连续段的长度,并给出构造
题解
Flamire 做法
Sol
考虑二分答案,设我们要求最长连续段 1 的个数是一个区间。
证明:可以用前缀和将所有限制表述为差分约束,1 的个数即为 1 的个数也是一个区间
那么我们只要求出这个最大值最小值就好了。
考虑求最少 1 的个数的一种贪心:
- 如果串中有长为
的连续段,那么两边的字符就已经确定,先不断把所有这样的限制处理掉 - 在这之后,我们从左到右扫,假设当前扫到
,右端点为 的极长0连续段为 ,左端点为 的极长0连续段为 ,那么如果 就在这里填0,否则填1
构造正确性可以简单分析得出,最小性比较容易感性理解(
最多 1 的个数同理。
那么我们就会求出答案了,接下来考虑构造。
我们固定一个位置 1 的个数,1 的个数,当 1 的时候 1 的个数会
我发现我好像什么都不会证,但是看起来真的很对!!!!
复杂度
题解做法
Sol
把上面的做法去贪心化一下。
首先,二分的时候求最大值最小值可以用 dp,一次转移一个连续段,设 1 个数
然后根据这个我们可以得出两个串,分别取到最大值和最小值,命名为
而构造的时候,我们说明对于所有 1 的个数在区间内的 1 的个数为
证明:
考虑最后一个 1 的个数
而在这之后,如果
11. QOJ2214 - Link Cut Digraph [E] ✔️
题面
有
题解
Sol
即为求强连通分量的
考虑加入一条边相当于合并若干个强连通分量,所以我们可以用并查集维护强连通分量内的点,只要求出所有合并操作即可。
我们进行分治,假设我们现在已经得到了
如果一条边的两端被缩在了一起,就说明我们
如果一条边的两端没被缩在一起,说明我们
可以发现一条边最多会在
12. QOJ6537 - One, Two, Three [E] ✔️
题面
给定长为
题解
Sol
我们选一些
可以观察一些显然的性质:对于我们选的所有
因此最后我们得到的解应该是,选择两个数
接下来就是要求这个解能匹配上
而
式子中的
复杂度
13. AGC072E - Flights [] ✔️
题面
给定一个
你一开始在
每个点有一个汇率
过程中你不能让钱或 miles 变为负数,请求你最少一开始要有多少钱才能从
题解
Sol
考虑确定路径之后,如何合理地兑换 miles 使得需要的钱数最少。
先一直走,走到钱用完为止,那么我们可以访问到路径的一段前缀,那么我们换 miles 也肯定是先在这里面最大的换,一直换直到前面的 miles 全被换完,此时如果还缺钱就接着换后面的最大的,这样一直换到钱够了为止。
那么注意到我们在路径上很多地方,要么没钱,要么没 miles,所以我们可以设计如下两个状态:
表示从 出发,一开始没有 miles 的情况下至少需要多少钱才能走到 表示从 出发,一开始没有钱的情况下至少需要多少 miles 才能走到
那么考虑走路的过程。
对于
- 在下一个
更大的点之前,我们先把 的 miles 花完了,那么就可以一开始就将所有 miles 兑掉,转化为 ,转移为 - 在下一个
更大的点之前,我们没用完 的 miles,设这个点为 ,那么我们到达 的时候一定没有钱,所以 ,其中后面的 是因为我们额外获得了 miles
对于
- 在
之后下一个 更大的点之前,我们先把 的 miles 花完了,转移为 - 在
之后下一个 更大的点之前,我们没花完 的 miles,设这个点为 ,令 ,那么转移为:- 首先我们
获得的 miles 数应该要大于 ,否则转移将无意义 - 然后我们需要钱数能够支撑我们先到
,因此需要对 取 - 我们需要钱数+兑换 miles 能够支撑我们到
,也就是 ,移项可得 - 我们需要剩余的 miles 数大于等于
,即 ,移项可得 - 也就是说最后的转移是
- 首先我们
初始
考虑优化。
我们试图能不能把这个更新过程换成 dijkstra。我们发现阻碍我们这么做的原因是因为最小的点可能被更新,具体地,如果最小的点是某个
但思考一下可以发现:
只有第一种转移会让值变小
我们每次更新完全之后,每个时刻最小的
一定不会再被更新了(因为我们显然不会从一个需要 miles 更多的点,绕着绕着需要的 miles 更少了)
相当于,我们把 Dijkstra 看成,对于某个点集
也就是说,我们每次拿出最小的
相当于我们对
每一轮外层 dijkstra,我们会先做一次
最后我们使用形如 dijkstra 套 dijkstra 的算法,可以通过本题。
14. QOJ962 - Thanks to MikeMirzayanov [E]
题面
给定一个
- 将
分为若干连续段 ,然后再将这些段按照 的顺序拼接在一起,得到新的
请构造方案。
题解
Sol
首先,操作可以转化为
考虑对于 01 串如何排序,我们不断对 01 连续段进行如下过程:
1 | 010101010101 |
这样我们把 01 连续段的个数大约除以了
我们分治,每次固定一个
排序之后递归到两边分别处理,显然操作可以并行。
因此我们在
15. QOJ967 - Rectangle Painting [E]
题面
有一个在左右上无限延伸的正方形网格,最底部的一行方格的
1 y l r,将 , 坐标为给定值的所有小方格染黑2 l r,对每个 ,称其与 相连的黑色方格高度为 ,求 , 的最大值
强制在线。
题解
Sol
维护白色格子连续段,初始每一行都是一个极长的白色格子连续段。
每次颜色段均摊,删除一个白色连续段再加入一个白色连续段。
询问答案需要我们维护的问题是:维护
这个可以用线段树套 set 标记永久化维护,复杂度
16. QOJ8085 - Bulbasaur [] ✔️
题面
有一个有向图,点排列成
这张有向图中所有边形如:从某个
定义
求
题解
做法 1
Sol
考虑拆点最大流转最小割。令
转移可以用高维一些东西优化,可以做到
做法 2
Sol
从第
具体地,我们随机对每条边赋权,然后求出第
而注意到区间越长秩越小,我们可以枚举秩,然后双指针,时刻维护区间内矩阵的乘积,可以做到总复杂度
做法 3
Sol
考虑拆点网络流。
首先求
证明:考虑先流到第
我们求答案也可以这么求,每次从起点开始搜索增广路,找到延伸到的最靠右的流,然后流过去(类似一个费用流的过程),这样显然也是正确的
对于每次增广,如果我们流到了第
令
注意我们可以利用原来跑完的残量网络,我们在
而
17. QOJ6538 - Lonely King [S]
题面
给定一棵
初始的边都是蓝色的,接下来你每次可以选择树上一条蓝色路径
点有点权
题解
Sol
注意到我们可以忽略路径是蓝色的限制,因为如果路径上有一条红边,我们可以先把这个红边拆成蓝边
而如果最后存在
为了方便,我们设状态为:
转移就是
转移可以用李超树优化,向上合并的时候可以使用李超树合并或者启发式合并,总复杂度
18. QOJ2599 - Anti-stress [K] ⭐
题面
给定二维平面上
特殊地,我们认为若
要求构造,或者判断无解
题解
Sol
考虑选一个十字,将平面划分为四个象限,然后我们只使用一三象限以及二四象限的配对,那么这个划分合法的条件是:上下点数一样、左右点数一样、一象限黑点数等于三象限白点数
可以发现前两个条件已经限制了我们十字
注意到我们还没有使用非水平的十字,令
那么注意到
总复杂度
19. QOJ1840 - K-onstruction [E]
题面
给定
题解
做法 1
Sol
这个看起来是一个
注意到我们可以给
而再注意到我们可以给
因此我们就有了一个
而可以发现
但我们可以一开始在集合内加入一个
但注意到我们没必要只限定插入一个
具体地,设
那么我们暴力搜索出所有元素个数
接下来考虑我们需要满足
算出来最多需要
做法 2
Sol
随机
具体地,只要我们负数都
不断随机直到合法即可。
20. QOJ14432 - Cyclic Topsort [E] ⭐
题面
给定
中元素都在 内且互不相同- 对于每个
,满足对于任意一条边 , 在 中出现过
求最长
题解
Sol
题目所求即为删除一个点,然后最大化能够拓扑排序掉的点的数量
考虑先把一开始就能拓扑排序掉的点删除,然后在剩下的图上做这个问题。
性质:任意两个点,删除之后能带掉的点的集合要么包含要么不交
证明比较显然。
有了这个之后,我们有若干种方法来做这道题:
使用启发式合并,每个点维护当前扩展出来的点集向外连边的集合,每次从一个点
开始拓扑排序,排到一个点 时将 点集向外连边的集合与 点集向外连边的集合启发式合并,这样不断进行即可,复杂度 或缩点,每次将一个入度为
的点缩到唯一到它的点上,也需要使用启发式合并,复杂度 或每次随机一个还没有被 ban 掉的起点,然后暴力跑一遍过程,将所有删除的点 ban 掉,之后不再考虑它们作为起点的情况,这样进行就是对的
本质上是一棵树,每次我们付出
的代价 ban 掉一棵子树,将贡献摊到子树的每一个点上,一个点被贡献的次数就是到根链上前缀最大值数量,因此期望复杂度是 的
21. QOJ2210 - Hamilton Path [K] ⭐
题面
给定一张
- 对于所有
, 存在当且仅当
具体地,如果总合法排列数
题解
Sol
首先进行一些浅显的观察,我们可以发现一种暴力的方式是从一个起点开始,如果这个起点有解,那么走的过程一定都是唯一的,因此
注意到如果存在解,那么对图的结构限制很强。那么我们不妨考虑知道一组解之后的情况。
我们按这条链将点标号为
可以画一下,发现此时如果想要从一个点出发经过所有点,走出的路径一定形如下图:

即从某个点出发,走到
那么如果红色路径是一条合法的解,考察这张图上还可以有哪些边:

可以发现可能的边一定形如图中绿色的边,而图中绿色的边都被红色路径经过的回边包含,因此我们得到结论:
- 确定一条合法路径之后,任意其它合法路径经过的回边一定恰好是所有没有被其它回边包含的边
当不存在
当存在
因此我们可以在求出一条路径之后,推出所有其它的可能的路径
那么问题在于我们如何求出第一个解。
做法 1
考虑维护
- 如果一条链链尾向外的连边恰好有一条,并且这条边指向另一个链的链头,就把这两条链拼起来
合并的过程可以用并查集维护,在合并两条链的时候,我们只需要再 check 新链的链尾是否只有一条指向链外的出边,这个可以暴力扫,扫到一个指向自己链的出边就将其删除,找到两个指向外面的出边就停止
合并到合并不动为止,那么我们会剩下三种链:
- 链尾没有向外连边的链
- 链尾有
条向外连边的链 - 链尾恰有一条向外连边的链,并且这条出边指向的一定不是某个链的链头
如果只有一条链,那么我们就直接找到了一个解。
如果有多条链,我们对可能的起点进行分析。
性质 1:可能的起点一定在第三种链上
证明:只有从第三种链上的点出发,我们才可能走出自己的这条链
性质 2:可能的起点一定是链头
证明:

设我们从红色点出发,开始走路径,那么我们必定会从这条链唯一的出边走出,走到另一个不是链头的点
而此时,两段蓝色部分都满足,如果我们走进了这段链,那么我们就再也无法离开这段链,也即终点部分必须同时在两个蓝色部分中,矛盾
性质 3:如果有至少三条第三种路径,那么一定无解
证明:

设我们出发的链为
分类讨论:
- 若
是第三类链,我们一定会从 走出, 连向其它链一定还会创建一个蓝色区域,因此不合法 - 若
不是第三类链,那么一定还有两个第三类链,而想要不创建出新的蓝色区域的话,这两条链一定都需要连向 的蓝色区域,而进入 的蓝色区域后一定无法离开,因此我们一定无法同时访问这两条链
因此,这种情况无解。
那么我们说明了,有解的情况下最多有两个第三类链,并且只有这两条链的链头可能成为起点,因此直接 check 即可。
总复杂度
做法 2
考虑随机化。
每次随机一个起点,从这个起点开始走,直到走不动为止,如果找到一个合法的起点就可以 break 了
所有被经过的点就没有再搜的意义了,因此我们下次再随机找一个没有被经过的点
可以证明,在有解的情况下,我们期望用
证明:
有解的情况下,将点按照这个解的编号顺序标号,可以发现,我们从任意起点开始,大部分搜出来的路径一定是这个解的一段区间,不满足这个条件的情况就是我们从某个起点开始一直走走到了
那么一旦我们搜到
而此时,所有点搜出的路径就是包含或不交的了,套用分析即可得到期望复杂度是
因此当搜耗费的时间大于
22. QOJ14426 - Grid Problem [E/K]
题面
你有一个
- 选择一个
子矩形,给这个子矩形中的元素加上或减去 - 选择一个
子矩形,给这个子矩形中的元素加上或减去
操作将矩形视为 torus(即矩形上下左右均循环)
求能得到多少种不同的值域在
题解
Sol
注意到以
进一步可以发现,只要每行每列之和
那么问题转化为,
使用单位根反演,给每行每列设变量
给每个
所求式子即为:
将指数上带
暴力枚举计算即可,复杂度
23. QOJ833 - Cells Blocking [E] ⭐
题面
给定一个 * 和 . 中的一种,分别表示障碍与空地
求有多少种方式恰好将两个 . 改为 *,使得修改之后不存在从 * 的路径
题解
Sol
称
那么将一个 . 改为 * 就可以让
那么一定是右路径和下路径各割一个,枚举右路径上割了哪个,那么我们可以套用刚才的方式,只要再求出新的右路径即可
设 ban 掉的格子是
- 现在我们就是在不断走的过程中,需要额外判断走过去的点
不能满足从 出发只有经过 才能到 ,可以发现这就是 的下路径不经过 的意思,容易发现所有下路径形成一棵树,递推出这棵树的 和 ,即可 判断 是否在 的子树内 - 找到与
的 相等的斜线上,向左下方向第一个空白位置,可以发现,新的右路径一定经过这个位置,那么从这个位置向 和 分别走,即可得到所求路径
总复杂度
24. QOJ850 - Edit Distance Yet Again [E] ⭐
题面
给定长分别为
编辑距离定义为:一次操作可以插入、删除、替换一个字符,将
题解
Sol
做法是 Levenshtein Distance 的弱化版。
应该是,我也不记得了。
考虑求编辑距离的 dp:
一般的情况现在还没有什么好的算法,而这题唯一的区别就是增加了对答案的限制
一件比较显然的事情是在 dp 过程中我们一定不会访问到
我们尝试从小到大扩展,每次维护出
可以发现,每条斜线上只有长度最大的
因此我们可以设状态
转移时
使用 SA 实现单组复杂度为
25. QOJ837 - Giant Penguin [E] ⭐
题面
给定一个
题解
Sol
这个询问看起来不好处理,首先我们考虑树上怎么做。
我们发现树上就已经需要使用点分治了,我们建出点分树之后,染黑一个点就是更新这个点到点分树上所有祖先的最短距离,查询就是遍历点分树上所有祖先
而在图上,我们发现这个图特殊保证了性质,但是这个性质看起来比较奇怪。
这个询问还是很难用别的方式处理,我们还是回到分治的思路,我们可以拓宽一下点分治的过程,改成每次选若干个关键点,把整张图切成若干个连通块,然后处理每个关键点到所有点的距离,对每个连通块递归下去处理
可以发现,我们任意取一个生成树,跨过生成树上任意一个点的非树边应该最多有
复杂度
26. ATXmascon 2022 - Happy Game [K] ✔️
题面
给定一张
- 初始将
染黑,接下来每次同时染黑一个或两个与之前就有黑色邻点的点,最少多少轮之后能将整张图染黑
求
题解
Sol
首先想办法发现结论:固定
证明:
可以发现这是答案的一个下界,我们也可以证明答案能取到这个界
考虑倒过来,我们随便取一棵最短路树,然后每次找到最短路最大的点,以及下一个最短路最大的能删的点(若存在),然后证明这个式子一定会至少
设选择的两个点到
- 如果
,那么 的所有 都会 ,而对于 ,这些层在删之前只有一个点,因此删完之后算出来的值一定不超过 ,而第 层不存在了,原先的 就是 的,因此最大值一定小于等于原来 - 如果
,那么原来 一定不是最大值,删完之后所有 的值一定会 , 的值不变,因此最大值也小于等于原来
那么我们就说明了这个式子的正确性,接下来考虑计算这个式子的最大值
即求
并且,当
同样地,对于
而上面这些条件综合起来,意味着我们选的
设这个点为
这个和割点相关了,因此我们可以建出圆方树。
这个问题显然有很多性质我们可以用,比如,如果我们选择了两个点
证明:

讨论
如果是圆点,如左图,我们将
如果是方点,如右图,我们将
而这样调整会让
因此,我们需要考虑的
- 如果
不在直径上,那么以直径为根后, 若不在 的子树内,由于我们一开始判掉了 ,因此 是叶子,那么一定有一个直径端点是一个合法的 ,能够把这个 干掉 - 如果
在直径上,我们不进行额外讨论
可以发现,此时
那么我们分别将两个直径端点定为根,首先固定
对两个直径中点分别求一遍,即可求出答案
总复杂度
27. QOJ857 - Social Distancing [K]
题面
给定一棵
每次你可以将
请在
题解
Sol
操作可逆,我们考虑给每个连通块选一个代表元。
每次尽可能把点往下放,按深度从大到小排成一个排列,我们按这个排列,将
那么每次就是选择一个点
判断是否有一个点能走到
因此我们只用考虑到根路径上没有其它在
那么我们就先进行一遍向下推的 dfs,然后再进行一次 dfs 看看有没有任何点能向上提即可
总时间复杂度
可以发现这个正确性哪哪都看着不那么严谨,但是我好像也没有找到人证过这个东西。为什么大家就都默认不需要证明了。
28. QOJ1166 - Designing a PCB [E]
题面
给定一个长为
这些点第
请构造方案或者判断无解
题解
Sol
如果直接把每两个
考虑使用一下大脑。
首先,如果
然后如果
因此我们对每个点向下或者向上建 2-sat,所有限制都是相等或不等,因此,可以用并查集解决
然后,我们需要说明只要满足这些必要条件,我们就一定能构造出来解
事实上确实是这样的,我们对于所有
复杂度
29. AGC070B - Odd Namori [E]
题面
给定一棵
中每个点出度恰好为 中没有偶环- 对于任意
, 中不存在 的有向边
求所有合法的
题解
Sol
这也太魔怔了。
考虑选择一些点,然后钦定它们最后组成若干个环,那么这些点最后对答案贡献的容斥系数应该是
但是这样还有不能选树边的限制,所以我们再对树边的限制进行容斥,也就是说,最后我们的形态应该是选出了若干条树上的点不交的链
考虑选出
推一下可以发现
也就是说,我们只用考虑什么都不容斥,和容斥一条链的方案
容易
30. QOJ1173 - Knowledge Is… [K] ⭐
题面
给定
- 每个人被分配的区间数不超过
,且一个人被分配的区间不交
构造方案。
题解
做法 1
Sol
很有道理的做法。
可以注意到即为求最大匹配。
我们称一组匹配里左边的区间叫做
初始将所有区间都放入
而前缀和
考虑二分,假设我们选了
而这个是可以处理的,考虑倒序枚举上面的
过程需要使用堆来维护,因此时间复杂度
做法 2
Sol
还是求最大匹配,考虑直接贪心。
将区间按右端点从大到小排序,维护一组未匹配的点左端点尽可能大的匹配,以及一些不在匹配中的点,扫到一个新区间时,执行如下操作:
- 如果存在一个未匹配区间能和新区间匹配上,那么能匹配的未匹配区间左端点显然都大于之后的任意一个区间,所以任取一个和新区间匹配上即可
- 否则,考虑新区间一定能和任意此时匹配好的右区间匹配,因此我们可以用这个新区间置换出来任意一个左区间。我们选择一个最大的置换出来(我们不会置换出右区间,因为如果新区间能和左区间匹配,那么左区间的左端点就已经可以自由匹配了,置换出右区间和左区间没有区别)
直接用 set 维护即可,复杂度
31. QOJ2554 - AND PLUS OR [E] ⭐
题面
给定一个长为
题解
Sol
太难了。
即要求
考虑转化为选三个不交集合
那么所求即为
复杂度
32. 集训队互测 2025 - 携春同行 [K] ✔️
题面
交互题。
给定
你可以进行如下两次询问:
- 一次性给定
棵点集为 的无根树,交互库会返回每一棵无根树的带权直径 - 给定一棵点集为
的无根树,以及一个整数 ,交互库会返回这棵无根树的带权直径是否等于
题解
Sol
考虑询问一个菊花,如果中心不等于
因此我们可以询问一边以每个点为根的菊花的值,这时候只要求出
我们再查询一个 sum,这时候排除掉两个
那么我们就可以求出所有
现在我们就需要求出一堆
考虑二分:如果我们想检验一个集合
此时如果
注意到上述二分需要满足
当
这时我们尝试找到另一个直径端点,询问以
因此我们可以用
取
33. QOJ6501 - Graph Partitioning [E] ⭐
题面
有两棵树
现在给定一张
题解
Sol
我们相当于要给每个点分配一个向左的父亲和一个向右的父亲
那么每条边
那么问题就是给定一张
直接 check 即可,复杂度
34. UR32 - 王之钦定 [K] ✔️
题面
给定一个长为
求最后颜色数
题解
Sol
考虑颜色数
1 | [ab...ab][a...a][ac...ac][c...c][cd...cd][d...d][bd...bd] |
容易发现的事情是交段一定是纯色的,且一定等于两边的合法段的颜色的交
考虑通过交段刻画这个结构,我们在交段之间转移,定义
但是直接转移只能得到很高次方的做法,因此我们考虑优化
观察性质:一个交段
也就是说对于状态
那么我们现在可以考虑重新开始设计转移了,从
下一个交段从
开始,那么枚举 和 ,转移到这部分首先可以分步转移,容易发现状态转移与
无关,对同一对 取最大的 去掉枚举 的复杂度,设辅助状态 ,去掉枚举 的复杂度,此时复杂度可以凸包优化做到
下一个交段不从
开始,那么设下一个交段为 ,那么 等于 或 ,为了优化转移,我们设一个辅助状态 ,先从 转移到 ,再从 转移到从
到 的过程中,我们希望规避掉枚举 的复杂度,由于 一定等于 或 ,这可以通过让 每次转移到下一个颜色等于 或 的位置实现,然后用一个颜色维记录另一种颜色是什么从
到 的过程中,知道这个新段的颜色是什么,可以用凸包优化掉枚举 的复杂度
总复杂度
35. QOJ1357 - Stone Catch Game [] ⭐
题面
有一个
白方先手,每次可以将白棋从
白棋与某个黑棋重合则黑方胜,若白棋先走出网格则白方胜,求胜者
题解
Sol
注意到
那么对于
那么毛估估一下,看起来我们只会选择两条斜线,然后直接用这个斜线去夹
考虑对于两个黑棋
- 首先,白棋一直走
不能直接越过 ,即 - 其次,白棋一直走
不能直接越过 ,即 - 最后,白棋如果一直走到
,两个黑棋恰好能抓到它的情况是分别在 和 ,因此我们要求
对所有
这些信息容易转化成三维偏序存在性问题,可以用二维偏序最值解决,复杂度
- Title: task19
- Author: Flamire
- Created at : 2025-09-08 00:00:00
- Updated at : 2025-10-23 09:52:04
- Link: https://flamire.github.io/2025/09/08/task19/
- License: This work is licensed under CC BY-NC-SA 4.0.