【题解】AtCoder Beginner Contest 247 补题记录
A Move Right
题意
给出一个长度为 且由 0
和 1
组成的序列。现在将除最后一位外每个位置上的字符右移一位。求最终得到的序列(第一位视作 0
)。
思路
模拟。
B Unique Nicknames
题意
有 个人,每个人有其名 和姓 。尝试给每个人起一个昵称 ,使得 且 , 且 。问是否存在合法方案。
思路
模拟。
用 map
记录每个人的姓和名在所有姓名里的出现次数。显然当一个人的姓和名出现次数均大于 时无解。注意特判一个人的姓名相同的情况。
C 1 2 1 3 1 2 1
题意
按以下方式定义序列 :
给定 ,输出
思路
,暴力递归模拟即可。
D Cylinder
给定 个操作,对于序列 ,每次操作可以:
在 末尾加入 个
取出 开头的 个元素,求它们的和。
数据保证对于操作 ,当时序列中的元素总数大于等于
思路
树状数组 + 二分。
考虑将每个操作 视作一个元素,维护由这些元素组成的序列:
用两个树状数组分别维护序列中 的前缀和 和 的前缀和 ,同时用两个指针 表示当前 由 中的元素组成。
对于操作 ,直接更改树状数组和指针。
对于操作 ,考虑在 中二分出第一个位置 ,使得 。此时分类讨论:
-
,直接树状数组求和。然后
-
,此时前 个元素和为 。此时 ,相应地需要修改树状数组。
树状数组复杂度 ,二分复杂度 ,总时间复杂度
E Max Min
题意
给定一个长度为 的序列 和两个正整数 。试求出满足 且 的有序正整数对 的个数。
思路
ST表 + 二分。
考虑用 ST 表维护区间最值。枚举 ,用四次二分得到 中:
-
第一个令 的位置
-
最后一个令 的位置
-
第一个令 的位置
-
最后一个令 的位置
显然 和 的交区间中,每一个下标都可以和 构成一对满足条件的有序数对,直接统计答案。
ST表预处理复杂度 ,单次查询最值 ,二分复杂度 ,总时间复杂度
注意 的线段树做法会被卡(或许是因为我常数大?)
F Cards
题意
有 张卡牌,第 张卡牌正面的数字为 ,背面的数字为 ,其中 均为 到 的排列。问有多少种方式,使得 到 中每个数字至少在一张卡牌的某一面中出现一次。
方案数对 取模。
思路
转化。
先考虑一个前置问题:若在 到 中,两个相邻数字至少要选一个,一共有多少种方案?
考虑令 个数的方案总数为 。分类讨论:
-
若选 ,则方案数为
-
若不选 ,则必须选 ,方案数为
显然
回到问题。不妨构造一个包含 个结点的图,并在 直接连边。显然图中每个结点的度数都是 ,因此这个图是由若干个环组成的。现在问题被转化成:求原图的边覆盖总数。
显然所有环都是等价的,因此考虑一个环的情况。令长度为 的环的边覆盖总数为 。将环的结点依次标号为 到 ,分类讨论:
-
- 选择边 。此时将除 外的边依次标号为 ,显然标号相邻的边至少要选择一条。方案总数为
-
- 不选择边 。此时边 和边 都必须被选择。同理,方案总数为
所以
用 表达 :
又有
所以
手推可以发现
最后所有环的 值乘积就是答案。
时间复杂度
G Dream Team
题意
有 个人,第 个人来自第 所大学,擅长第 门学科,权值为 。定义 Dream Team 为若干个人的组合,满足:
-
Dream Team 中的所有人来自不同的大学
-
Dream Team 中所有人擅长的学科不同
设 Dream Team 最多有 个人。试对于 ,求包含 个人的 Dream Team 的最大权值和。
思路
费用流。
考虑新建两个起点 和汇点 ,将每所大学和每个学科分别视作一个结点。
在 之间连接一条容量为 ,费用为 的边。
在 之间连一条容量为 ,费用为 的边。
在 之间连一条容量为 ,费用为 的边。
枚举最大人数 。每次在 之间连接一条容量为 ,费用为 的边,表示尝试增加 个人。如果增广的流量为 ,说明此时已经得到最大人数,退出;反之,此时增广该流量的最大费用就是加入的人的权值,求前缀和即可。
显然 ,时间复杂度是 O(能过)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?