MoreHolidays

[ABC300F] More Holidays

问题关键:发现并证明一下引理:

  • 一定存在最优解最左端的 o\([1,n]\)

考虑最优解最左端的 o 不在 \([1,n]\),那么修改的 x 位置肯定大于 \(n\),那么对于每个修改的位置,将修改的下标 \(-n\)(即原来修改 \(i\) 处的 x,现在修改 \(i-n\) 处的 x),因为是循环串,所以这样操作一定是可以进行的。然后又因为这个 o 的左端不能延伸,新串的左右相对位置并没有变(即对于修改的位置,左右情况是完全没有发生变化的),所以这样的操作只要一直进行,那么最优解最左端的 o 一定能跑到 \([1,n]\)

有了这个引理,那么问题就好解决了。我们直接枚举起点,看终点最远能延伸到哪里。当然是尽量穿过,直到这段区间内的 x 个数超过 \(k\) 为止。这个还是好处理的,主要考虑零散的部分和整段的部分,零散的部分可以用前缀和处理当前位置到末尾的 x 的个数,然后中间的部分直接循环节搞定,最后多出来的部分再使用前缀和搞定。

特别注意要特判最大长度不能超过总长度 \(nm\)

code

posted @ 2023-06-16 13:10  wscqwq  阅读(8)  评论(0编辑  收藏  举报