1 条题解
-
0
思路
若不交换,设相邻石堆之间执行操作的次数依次为 。第一堆只能通过第一条相邻边清空,所以 ;此后有 。全部石堆能清空,当且仅当递推值始终非负且最后与 匹配。
交换只影响两个相邻位置。可以预处理每个前缀从左递推后的剩余值,以及每个后缀从右递推后的剩余值,再用常数时间检查一次交换能否把两侧连接起来。
做法
从左向右计算前缀递推值,同时记录此前是否都非负;从右向左做对称计算。
先检查不交换的情况。随后枚举相邻位置 。若 左侧前缀或 右侧后缀已经非法,则跳过。设左侧需要在边界继续消去的数量为 。交换后先处理原来的 ,得到 ;再处理原来的 ,得到 。要求 非负,并且 恰好等于右侧后缀所需的连接数量。
任意一次交换满足条件即可输出
YES,否则输出NO。正确性证明
在线性相邻结构中,第一堆的石头只能与第二堆配对,因此第一条边的操作次数被唯一确定。依次向右,每条边的操作次数也被前一条边唯一确定。所以非负递推并在末端闭合是无交换可行的充要条件。
固定交换位置后,交换区间左侧和右侧均未改变,分别由预处理的前缀、后缀唯一决定。算法按照交换后的两个值执行同一唯一递推,并检查与右侧需求是否相等,因此该检查是这次交换可行的充要条件。枚举了所有相邻交换以及不交换情形,所以最终判断正确。
复杂度
每个测试用例只进行常数次线性扫描,时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1267
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者