Atcoder 题目选做(三)
1. [ARC152E] Xor Annihilation
给
个动点,权值为 的排列,对于每个点,设其左右两边所有点权异或和分别为 ,那么他会向较大 较大的一边移动,如果 则静止不动。 所有点运动速度一定,如果两个点相遇那么他们会合成一个新点,权值为他们的异或和。
在左右无穷点处放两个权值为
的静点( )求有多少 使得最终所有点都静止。 数据范围:
。
注意到权值异或总和为
那么如果两个点
那么整个排列会不断操作直到所有
如果
因此我们要使得最终所有
因此我们要计数有多少
求出所有
时间复杂度
2. [ARC152F] Attraction on Tree
给定一个
个点的树,一个动点 初始在 ,找到一个排列 ,使得第 步满足 然后让 向 方向移动一条边,最终 ,最小化过程中 经过的点数。 数据范围:
。
显然最终经过了
先考虑最小值,即只经过
那么对于路径上第
我们发现很多操作都要在折返中抵消,那么我们只要钦定链上哪些操作最终有用,剩下的操作形成若干跨子树的匹配,那么我们一定能构造一个合法的
根据经典结论,那么我们要求剩下的操作中不存在绝对众数。
找到最大的
因此这种情况的充要条件就是
否则找到不合法的这棵子树,枚举一个连通块
那么我们依然要求
那么我们要在这个基础上保留尽可能少的节点是的所有
注意到
时间复杂度
3. [ABC273G] Row Column Sums 2
求有多少个
正整数矩阵使得其第 行和是 ,第 列和是 。 数据范围:
。
显然
否则我们可以看成二分图,
但是对于
但这并不完全对,假如
因此我们枚举
其中乘第二个
时间复杂度
4. [ABC273Ex] Inv(0,1)ving Insert(1,0)n
给定
个分数 ,记 表示 在 Stern-Brocot Tree 上的虚树大小,求 。 数据范围:
。
先考虑如何求
因此对于当前树上区间
那么对于这个问题,首先如果
我们可以对所有分数建虚树,对于虚树上的一条链,贡献次数只和链底子树内包含的分数下标集
然后递归,维护一个分数集合
时间复杂度
*5. [AGC058D] Yet Another ABC String
求有多少
个 , 个 , 个 构成的字符串使得不存在子串 。 数据范围:
。
记
考虑容斥,钦定若干个
因此我们不妨枚举极长的被钦定不合法的段,先求容斥系数,设
边界条件是
枚举每一段的长度,会发现此时的序列形如:若干个被钦定的
- 长度为
的串相当于 个 ,但有 种方法选颜色。 - 长度为
的串相当于 个 和一个自由字符。 - 自由字符可以看成
的长度为 的串。
因此设
答案为
考虑如何求
其中
我们只要求
最终答案需要
时间复杂度
6. [AGC058E] Nearer Permutation
对于两个长度为
的排列 ,定义它们的距离 为:
- 每次交换
中相邻两个元素,使得 的最小操作次数。 定义单位排列
,定义 为字典序最小的排列 满足 。例如当 时 。 给定排列
,判断是否存在排列 满足 。 数据范围:
。
以下过程排列下标均为均为
先考虑一种求
- 记
。 - 进行如下操作
次:求出 ,把 插入答案序列 的末尾并删除,然后令 。
这个过程相当于贪心,每次这样的操作肯定会选取一个前缀最小值,而移动该前缀最小值对
观察
那么说明
考虑删除
我们只需调整
先令
我们希望删除
那么把
因此我们要让
时间复杂度
*7. [AGC058F] Authentic Tree DP
对于一棵
个点的树 ,定义 为:
- 若
则 。 - 否则对于所有
,设 为切掉这条边形成的两棵子树,那么 。 给定
,求 的值。 数据范围:
。
看到这个模型,考虑编一个组合意义:在每条边中间插一个点,那么
那么
然后我们可以考虑容斥,把边大于其父亲的限制容斥,那么所有的限制都形如儿子小于父亲,所有事件都独立,只要维护每个点为根的连通块大小即可。
转移时类似树形背包,动态枚举每条边断不断即可。
时间复杂度
8. [ARC153E] Deque Minimization
给定十进制串
,记 表示按如下方式能得到的最小十进制串 :
- 从高到低考虑
的每一位,分别加入 的首部或尾部。 给定
,求有多少 使得 。 数据范围:
。
考虑
因此我们可以得到一个区间 dp:
把整个转移写在网格图上(图源官方题解):
要求的就是从
首先我们发现,如果
因此我们要考虑的
暴力转移肯定不优,不妨尝试把这段递增前缀中值相同的缩起来,这样我们就只要处理
对于相同的一段
然后右侧是若干连续向右的矩形转移,直到
可以发现
那么我们只要考虑
根据插板法可以直接算出多次前缀和的转移系数:
时间复杂度
9. [ARC153F] Tri-Colored Paths
给定一张
个点 条边的无向简单连通图,求有多少种给边染色 的方法,使得至少存在一条简单路径上有三种颜色。 数据范围:
。
注意到限制比较松,我们可以考虑染了三种颜色但没有这样路径的方案数。
先考虑树的情况,取某条极长路径
那么
因此我们还能证明这样的
方案数就是
因此对于一棵树,合法的染色方案一定存在恰好一个节点,使得该节点每个子树内都染相同颜色。
然后考虑一般情况,先缩点,对每个点双联通分量内部讨论:
- 存在一个长度
的环,此时整个点双联通分量只能染同一颜色,否则必然存在一条路径从任意一个点出发经过两种颜色,此时这个点往外连第三种颜色即可(手玩可以得出结论)。 - 否则该点双连通分量中只有三元环,先假设每条边颜色各不相同:
- 手玩发现如果环上存在两个点
,以及环外两点 使得 存在( )那么这个环不能染 种颜色。 - 否则分类讨论:如果
都只和 个环外点相连,那么此时三元环可以染三种颜色,然后环外边染该点在环上对边的颜色,恰有 种方案,这种情况只在 时出现。 - 否则这个点双一定恰为三元环,且恰有一个点
向外连边(假设 ),手玩发现三元环必须染三种不同颜色,且环外所有边必须都染 对边颜色,也只有 种方案。
- 手玩发现如果环上存在两个点
否则所有点双都同色,类似树的结论,可以在圆方树上恰取出一个圆点使得其每个子树染相同颜色。
答案还是
时间复杂度
10. [ARC154E] Reverse and Inversion
给定一个
的排列 , 次操作,每次随机一对 并翻转 。 对于最终的每个排列
,计算 。 数据范围:
。
考虑计算每个
因此答案就是
可以发现对于每个
因此对于每个
那么就可以快速计算每个
时间复杂度
*11. [ARC154F] Dice Game
给定一个
的随机变量,对于 求随机出 每个数至少一次的随机次数的 次方的期望。 数据范围:
。
假设
因此
先考虑求
那么最终的
由于
而
其中
而这个函数也可以通过分治 NTT 维护通分后的分子分母。
最后多项式求逆除一下得到
时间复杂度
12. [ARC155D] Avoid Coprime Game
给定
和 ,A 和 B 轮流选择 并令 ,不能重复用 ,谁把 变成 就输。 对于每个
,求出 A 第一步操作该数后谁会赢。 数据范围:
。
注意到
设
判断是否存在
但是我们现在可能可以不让
我们发现一个人会拖延时间当且仅当
那么我们需要记录
那么跟上面类似 dp 即可,最后处理拖延时间的情况。
时间复杂度
*13. [ARC155E] Split and Square
设
是由 个 位二进制数组成的集合,定义 表示 。 一次操作可以选定
,使得 ,求使得 的最小操作次数。 数据范围:
。
这种问题先考虑
那么我们知道
那么
然后我们分析每次线性基大小减小的下界,假如我们只想让新的
那么容易证明
那么这样操作每次线性基大小至少
再进一步分析:注意到操作一次之后
那么第二次操作以及之后每次操作不可能令
那么我们只要特殊处理第一次操作,我们又发现令
因此我们只要求出这个新集合的线性基大小即可,std::bitset
优化一下。
时间复杂度
14. [ARC156D] Xor Sum 5
个值 填入 ,可以重复(相等的 算不同元素),求所有 的异或和。 数据范围:
。
首先根据 Lucas 定理
那么对应的方案数
那么我们只要知道每个
从低到高考虑每一个二进制位
注意
显然进位数不超过
时间复杂度:
15. [ARC156E] Non-Adjacent Matching
给定
个点 ,定义一张图是好的需要满足:
之间没有边。 - 每个点度数
。 - 所有点度数和
。 求有多少
可以作为一张好图的度数序列。 数据范围:
。
记
。 满足 。 满足 。
可以验证这就是合法的充要条件,构造每次取一个
然后考虑对这样的序列计数。
我们容斥枚举
先考虑没有钦定位置的情况,直接容斥得到方案数为:
对于
然后考虑钦定一个位置的情况:
枚举这两个位置的和
dp 预处理求出
由于还要钦定具体位置,所以最后答案记得
对于钦定两个位置的情况,容易发现这两个位置一定相邻。
设对应的三个元素分别为
可以对所有
这一部分的答案也要记得
时间复杂度
16. [ARC156F] Make Same Set
给定
。 对于每个
把 加入 , 加入 ,求最大的 使得 并输出方案。 数据范围:
。
先考虑可以不加入
不妨猜测这个问题的答案就是最终问题的答案。
显然答案不可能更大,我们只要保证
我们考虑调整法:
- 如果
( 也同理),直接令 加入 ,显然 ,那么此时对称差变小,是一种合法的调整。 - 否则对于任意
,显然 ,此时令 同时加入 。- 如果
,那么 不变,下一次操作可以调整掉 使得对称差变小。 - 否则
变大,对称差变小。
- 如果
那么我们只要
时间复杂度
17. [ARC157E] XXYX Binary Tree
给你一棵二叉树(儿子数
),你需要给每个点黑白染色,使得对于 条父亲到儿子的边中:
- 有
个黑 - 黑。 - 有
个黑 - 白。 - 有
个白 - 黑。 - 没有白 - 白。
数据范围:
。
首先所有白色都是独立集,因此有
并且每个白点对
因此我们要找一个独立集包含
那么我们可以 dp,设
时间复杂度:
*18. [ARC157F] XY Ladder LCS
给定两个长度为
的 01 串 ,你可以交换若干对 ,最大化 并输出之,如有多解输出字典序最小的一个。 数据范围:
。
首先对于每一对匹配的
那么我们有一个暴力的做法:维护
转移时枚举是否交换,是否匹配,如果把当前的
这样复杂度是
观察到答案看起来比较大,事实上可以通过暴力枚举证明对于连续的
因此答案
根据题目的要求,我们要按长度为第一关键字,字典序为第二关键字比较信息,显然 可以在最高位前面加一个
时间复杂度:
*19. [Hitachi20F] Preserve Diameter
给定一棵
个点的树 ,求有多少种在树上加边的方式使得得到的新图 :
- 无重边自环。
- 直径长度不变。
- 对于任意一对未连接的点对,连边后图的直径都会变小。
求合法
的数量。 数据范围:
。
首先我们发现,如果
考虑
因此一组合法的
我们发现一组
但我们这样解决问题还要枚举直径起点,比较好的想法是枚举直径中点,然后 dp 时维护子树内深度为的
对于直径长度为奇数的边,把这条边切掉形成两棵子树分别 dp 即可。
时间复杂度
20. [ABC274Ex] XOR Sum of Arrays
给定
, 次询问 与 的字典序大小关系(两个序列的异或定义为所有元素对位异或)。 数据范围:
。
显然只要求出最大的
那么我们自然考虑设计一个哈希函数维护这个过程,但普通的字符串哈希函数不支持异或,即
注意到异或又能看成二进制下不进位加法,且乘法对加法有分配律,那么我们要单独看这个二进制数的每一位,可以用向量来看待,因此我们可以设计矩阵来描述哈希函数信息。
记
而
而在构造出哈希函数后,我们可以用倍增解决原问题,直接维护所有
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】