Atcoder 题目选做(五)
1. [ARC159E] Difference Sum Query
给定
,定义 的深度 为:
- 初始
。 - 第
次操作求出 按 的比例的中点 。 - 如果
,那么 深度为 ,否则递归 或 。
次询问 ,求出 。 数据范围:
。
注意到每次操作实际上是在树上二分,可以建出类似线段树的结构,由于
这棵树的中序遍历是
那么答案所求就是
可以转化为
求
时间复杂度
2. [ARC159F] Good Division
定义一个序列是好的当且仅当可以每次删去一对相邻不同的数把序列删空。
现在给定一个长度为
的序列 ,计数有多少序列划分方式使得每一段都是好的。 数据范围:
。
先考虑哪些序列是好的,手玩发现当且仅当一个序列没有绝对众数的时候是好的,证明如下:
有绝对众数的序列把非绝对众数全部用掉之后也一定剩下一些绝对众数,因此不能清空。
否则只有出现次数为序列一半的数可能变成绝对众数,如果这种数只有一个,那么随便删都行,有两个的话这个序列只有两种颜色,找一个交界处一种颜色删一个即可。
因此可以设计一个 dp:
注意到绝对众数这个条件一般会用摩尔投票法维护,而摩尔投票信息容易合并,因此想到 CDQ 分治。
考虑
又因为绝对众数切换至少需要两倍的长度,因此
由于摩尔投票不好同时维护多种颜色的情况,那么我们可以枚举每个可能的绝对众数
时间复杂度
3. [ABC279Ex] Sum of Prod of Min
对于所有长度为
元素和为 的数列 求 之和 。 数据范围:
。
考虑第
那么答案就是:
由于
然后就可以用欧拉五边形数公式变成
那么观察分母发现
那么答案就是:
显然这个式子只有
时间复杂度
4. [ABC280Ex] Substring Sort
给定
个字符串, 次询问所有字符串里的第 小串(位置不同算不同)。 数据范围:
。
考虑建立所有串的前缀树,字典序就是前缀树上的 dfs 序。
由于串数太多,考虑压缩前缀树,即所有反串构成的广义后缀自动机的 Parent-Tree。
答案就是这棵树上的 dfs 序,对于同一个节点,我们要求他的
那么每个询问离线下来 dfs 双指针按顺序找到属于哪个节点对应的串,同理实际串长也可以简单算出。
那么我们只要比较 Parent-Tree 上
时间复杂度
5. [ABC281Ex] Alchemy
给定
种 级宝石,对于一个 级宝石可以以如下方式合成: 级的宝石各选 个, 级宝石选任意个不同种的,求能合成多少种 级宝石。 数据范围:
。
设
考虑如何计算这个值:不妨设
维护
但是
但我们注意到
同时
时间复杂度
*6.[WTF22D] Welcome to Tokyo!
在
的数轴上有 个区间 ,对于 求出在数轴上选 个点至多有多少个区间与这些点有交。 数据范围:
。
看着题目的形式很像线性规划,考虑扩展到实数范围然后对偶:设
可以证明这个线性规划的解一定在
设三个式子对应的对偶变量为
注意到
那么设线段集为
那么枚举
那么我们只要求出
考虑
那么用数据结构维护这个过程:先找到右端点最小的线段
我们需要 multiset
维护
线段树维护
线段树维护区间
这些都是经典操作,可以直接维护,比较方便的写法是把线段编号按
容易发现每个线段至多删除一次,因此每个线段树的操作次数
时间复杂度
7. [ABC283Ex] Popcount Sum
组询问给定 求 。 数据范围:
。
显然考虑拆分每一位,对于
那么设
显然可以看成
时间复杂度
8. [AGC062B] Split and Insert
给定一个排列
,第 次操作( )可以以 的代价把末尾 个元素和前 个元素以任意顺序归并。 求把这个排列变成
的最小代价。 数据范围:
。
显然可以考虑时间倒流,变成把
考虑最后一次操作(倒流前的第一次操作),显然序列中
注意到这两个子问题是完全独立的,即只考虑这个排列
那么这就形成了子结构,
边界条件为初始满足的
时间复杂度
9. [AGC062D] Walk Around Neighborhood
给定
和 ,选择一个排列 ,第 步恰好移动 的曼哈顿距离。 找到一条从原点出发返回原点的路径,最小化路径到原点的最大曼哈顿距离。
数据访问:
。
先对
设答案为
由于
根据调整法,一条路径可以走到边界上,那么这条路径能走到边界上的任意一个点。
那么我们找到一个
先进行所有
显然两个
然后我们要把 std::bitset
维护。
容易发现所求的子集和
时间复杂度
*10. [AGC062E] Overlap Binary Tree
定义一个长度为
的二元组序列 是好的,当且仅当:
构成一个 的排列。 。 。 - 恰好存在
个 满足 。 - 存在一个有
个节点的有根树满足对于任意 , 在树上有祖先-后代关系当且仅当区间 有交(可以是包含关系),并且该树满足每个节点有零个或两个儿子。 给定
,数有多少个好的二元组序列,对 取模。
先不考虑第四个限制,考虑把一个合法序列建成二叉树。
显然和所有区间都有交的区间只有一个,把这个区间提到根上,然后删掉。
那么剩下的
显然一个区间序列可以唯一对应一棵无标号二叉树,那么枚举一棵无标号二叉树尝试计算对应的合法序列数量。
自下往上确定每个区间,考虑
我们考虑
设
从叶子上计数,设这个叶子向上最多走
设叶子数
最终会得到一棵有两个根的无标号树(根之间有顺序),这两个根就是原树根节点所在的两条同向链。
一个转化的例子如下图(来自官方题解):
可以发现一条链的长度在转化后就是一个点的度数。
给
然后考虑生成树的个数,每次选一条边,然后找一个没有父亲的点当儿子,方案数为
最后除去选边的顺序
用生成函数描述答案:
现在考虑加入第四个限制,显然长度为
那么一个叶子被钦定长度为
用多项式快速幂解决,注意到两个多项式的
时间复杂度
11. [ABC289Ex] Trio
数轴上有三个动点初始在
,每秒随机移动到左邻居或右邻居,求 秒后三个人首次相遇的概率。 数据范围:
。
先求方案数最后除以
考虑容斥,设
那么我们知道
只要求出
先平移使得
不妨假设
设两式分别和
那么设
对于
最后多项式求逆除一下即可。
时间复杂度
*12. [ABC290Ex] Bow Meow Optimization
给定
个 A 和 个 B,每个有权值 ,定义一个排列中某个位置的系数 为他左右两侧另一种字符的出现次数之差。 重排整个序列,求最小的
。 数据范围:
。
先考虑枚举一个 A,B 的排列,算最小代价。
首先对于排列中所有的 A,他们中的
因此根据排序不等式排列所有 A 和 B 即可。
假设
否则假设 A 数量较少,找到下一个 A,把他插到
如果
此时大胆猜测
否则如果
所以我们按权值从大到小考虑所有字符,并且讨论当前字符放在序列的最左边还是最右边即可。
设
转移时枚举每个 A/B 的决策转移即可。
时间复杂度
13. [AGC063C] Add Mod Operations
给定
每次操作能选 令所有 , 次操作内使得 变成 。 数据范围:
。
首先如果
手玩可以发现:令
逐步清空原本
那么
否则考虑取充分大值
但是这样操作数
时间复杂度
*14. [AGC063E] Child to Parent
给定
个点的有根树,每个节点上有一个数 。 每次操作可以选定
然后 。 求有多少个不同的
可以被生成。 数据范围:
。
首先合法操作必然可以调成从下到上,那么我们设
那么每次
先考虑根节点上的
那么分拆下去我们要知道
设
转移很简单,考虑每次做后缀和:
把自然数幂和看成一个关于
再做后缀和前求出
时间复杂度
15. [ARC160D] Mahjong
定义一个序列是好的当且仅当:它可以通过给长度为
的区间 和单点 两种方法清零。 求长度为
,元素和为 的好序列有多少个。 数据范围:
。
考虑一个序列会对应多少清零序列,注意到两个清零序列本质相同只可能是把
那么我们钦定区间
设
那么
时间复杂度
16. [ARC160E] Make Biconnected
给一棵
个点的二叉树,点有点权,加入一条边的代价时两端点点权和。 最小化加入边的代价和使得这张图变成点双连通图,给出构造。
数据范围:
。
显然所有叶子都必须连一条边,否则删掉他的父亲就不连通了。
假设这棵树有偶数个叶子
把叶子按 dfs 序排列,连接
。 显然删掉一个点之后整棵树最多分成 dfs 序上的三个区间。
若分成区间数
时是简单的。 否则讨论
属于哪个区间,如果是第一个或第三个,那么这个区间和另外两个都连通。 如果在第二个区间,那么二三区间显然连通,并且第一个区间和
连通,那么三个区间连通。
否则我们考虑给一个叶子和树上某个点连接,其他点用上述方式构造。
对于一个叶子
那么我们可以用类似换根 dp 的方式求出删掉每个点的代价,选最小值即可。
时间复杂度
17. [ARC160F] Count Sorted Arrays
给定
个 个排列, 次操作给定 ,对于每个 的排列交换 ,求出有多少排列被排好序,强制在线。 数据范围:
。
显然可以用经典的 01 序列的技巧,设
一个排列合法当且仅当分成的每个 01 序列最后操作完都是有序的。
考虑把一个排列看成从
但此时复杂度为
每次加入非平凡操作时更新所有过
时间复杂度
18. [ARC161E] Not Dyed by Majority (Cubic Graph)
给定一张图,每个点度数为
,给每个点赋值 ,定义一次变换是把每个点的权值同时变成其邻域权值的众数。 构造一个不可能是变换后结果的颜色序列。
数据范围:
。
考虑如何 检验
设
我们只要找到一个使得 2-SAT 无解的序列。
容易发现假如两个序列在变换后结果相同,那么就必定会产生一个序列不可生成。
考虑
因此我们说明至少有
19. [ABC293Ex] Optimal Path Decomposition
把
个点的树进行树链剖分,每个链染一个颜色,最小化路径颜色数的最大值。 数据范围:
。
根据重链剖分的结论,答案不可能超过
check 的时候设
对于一条边
时 表示选不同颜色。 时 表示选同颜色。
直接转移即可。
时间复杂度
20. [AGC064C] Erase and Divide Game
给定
,两个人轮流操作,删去奇数或偶数,然后把剩下 中元素除以二下取整,删空的人获胜,问谁必胜。 数据访问:
。
先考虑
那么现在面对的是若干区间,考虑自下而上地维护:先考虑最高位
注意到每次操作不用一个一个合并,可以把胜负态相同的一段区间一起合并:把所有区间分成
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】