1 条题解

  • 0
    @ 2026-9-3 10:38:58

    思路

    若不交换,设相邻石堆之间执行操作的次数依次为 x1,x2,…,xn−1x_1,x_2,\ldots,x_{n-1}。第一堆只能通过第一条相邻边清空,所以 x1=a1x_1=a_1;此后有 xi=ai−xi−1x_i=a_i-x_{i-1}。全部石堆能清空,当且仅当递推值始终非负且最后与 ana_n 匹配。

    交换只影响两个相邻位置。可以预处理每个前缀从左递推后的剩余值,以及每个后缀从右递推后的剩余值,再用常数时间检查一次交换能否把两侧连接起来。

    做法

    从左向右计算前缀递推值,同时记录此前是否都非负;从右向左做对称计算。

    先检查不交换的情况。随后枚举相邻位置 i,i+1i,i+1。若 ii 左侧前缀或 i+1i+1 右侧后缀已经非法,则跳过。设左侧需要在边界继续消去的数量为 xx。交换后先处理原来的 ai+1a_{i+1},得到 y=ai+1−xy=a_{i+1}-x;再处理原来的 aia_i,得到 z=ai−yz=a_i-y。要求 y,zy,z 非负,并且 zz 恰好等于右侧后缀所需的连接数量。

    任意一次交换满足条件即可输出 YES,否则输出 NO。

    正确性证明

    在线性相邻结构中,第一堆的石头只能与第二堆配对,因此第一条边的操作次数被唯一确定。依次向右,每条边的操作次数也被前一条边唯一确定。所以非负递推并在末端闭合是无交换可行的充要条件。

    固定交换位置后,交换区间左侧和右侧均未改变,分别由预处理的前缀、后缀唯一决定。算法按照交换后的两个值执行同一唯一递推,并检查与右侧需求是否相等,因此该检查是这次交换可行的充要条件。枚举了所有相邻交换以及不交换情形,所以最终判断正确。

    复杂度

    每个测试用例只进行常数次线性扫描,时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    1267
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者