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\)。