AtCoder Beginner Contest(ABC) 247 A~G 题解
点击各题标题可以跳转到原题。
A - Move Right(Difficulty: 14)
Statement:将长度为 的 01 串整体右移一位。
Solution:这个有什么好说的吗
Code:https://atcoder.jp/contests/abc247/submissions/30847456
B - Unique Nicknames(Difficulty: 202)
Statement:
- 给 个人的姓、名,问是否每个人都有别人所没有的姓或名。
- ,记最大串长为 ,有 。
Solution:
- 算法一:对于每一个人的姓名,对其他人逐个枚举判断,。
- 算法二:用 std::map 存每个人字符串,枚举的时候看看姓、名是否只有自己出现。时间复杂度 ,有大常数。
- 算法三:用 Trie 存下所有的姓名串,记录末尾节点的访问次数。时间复杂度 ,空间复杂度。
Code:https://atcoder.jp/contests/abc247/submissions/30852679
C - 1 2 1 3 1 2 1(Difficulty: 149)
Statement:
- 有一个初始序列 。
- 现在进行 次操作,第 次操作将自己复制一遍,拼到末尾,正中间再插入一个数 。
- 问 次操作后的数列。。
Solution:
- 没什么好说的,直接模拟即可,数组不要开小了。
Code:https://atcoder.jp/contests/abc247/submissions/30854775
D - Choose Me(Difficulty: 468)
Statement:
- 维护 次操作,操作分两种。
- 1. 队尾插入 个权值均为 的球。
- 2. 从队头取出 个球,并输出这 个球的权值和。
- 。
Solution:
- 像维护队列那样,找一个指针,记录当前正在取第几个操作放进去的球,以及这一批球剩几个。
- 时间复杂度 。
Code:https://atcoder.jp/contests/abc247/submissions/30859907
E - Through Path(Difficulty: 1256)
Statement:
- 有一个长度为 的序列 。
- 给出两个数 ,问区间最大值等于 ,最小值等于 。
- 。
Solution:
- 二分/双指针 + 线段树/ST表都是经典问题,可以快速解决,但是时间复杂度至少带个 ,码量也大。代码点这里。
- 这里简单讲下 且很好写的做法:
- 从左到右枚举,对每个位置 记录在自己以左,且分别等于 的距离自己最近的位置 。
- 再记录自己以左且最近的大于 或小于 的位置 。
- 若 ,那么答案就累加 。最后输出累加的和。
线性复杂度做法代码:https://atcoder.jp/contests/abc247/submissions/30895819
F - Cards(Diffyculty: 1697)
Statement:
- 有两个 的排列 ,。
- 你可以选若干个下标 ,使得 构成的集合包含完整 的排列。
- 求方案数对 取模的值。
- 。
Solution:
- 我们按照 大小把 排序,这样 变为 ,可以当下标用。设位置 现在的值为
- 若 ,代表我们选了下标 时只得到了 。
- 若 ,相当于我们选下标 时得到了 两个值。
- 由于 数组是两个排列,因此每个元素恰好会出现两次。
- 由于 位置的值是 ,所以下标是 的值肯定又指向了另一个数。不难发现,这样一直指下去一定会形成一个环。
- 那么这 个值就被分割成了若干个大小不一的环。由于环与环之间是独立的,我们只要计算每个环的方案数,最后乘起来就可以。
- 问题可以转换成: 绕成一个环,有多少个选数方案使得每相邻两个位置至少被选了一个数。
- 时答案很显然,为 。
- 时,假设我们从原来的环 插入一个 。
- 令环大小为 的答案为 ,那么有关系式 。
- 这个式子可以理解为 的环插入元素 , 选/不选得到的方案数和。读者可以自证一下。
Code:https://atcoder.jp/contests/abc247/submissions/30876626
G - Dream Team(Difficulty: 2159)
- 有 个人,每个人有两个属性 ,以及他的价值 。
- 现在要从这 个人中选择 个人,要求这 个人两两的 不相同,两两的 也不相同。
- 请问 的最大可能值 是多少?对于 ,求出恰好选择 人所能得到的最大价值和。
- ,。
Solution:
- 很容易想到网络流。既然要每个 都算答案,我们如果每次在初始的图上限流,跑 次 MCMF 时间复杂度就炸了。
- 这时我们应该联想到 EK 算法是单线程求网络流的,可以理解为如果流入边限制为 ,那么 EK 算法每增广一次,最大流最多增加 。
- 然后就可以用这个性质,只需要跑一次 MCMF 即可。
- 虽然时间复杂度上界是 的( 是最大流, 是点数,),但是卡不满,所以跑得非常快。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话