截至2019/10/16跑到了Luogu最优解Rank11, 有生之年有生之年.
Description
给你一个数组,其中有n个元素。每个元素不是0就是1。 现在可以进行k次操作,每次操作可以改变数组中的一个元素(只能改成0或1)。 请你求出操作后最长连续1的序列的长度,并输出操作后的序列。
Samples
Input #1
1 | 7 1 |
Output #1
1 | 4 |
Input #2
1 | 10 2 |
Output #2
1 | 5 |
Hint
( 1<=n<=3*10^5,0<=k<=n)
Solution
首先显然的一个暴力就是枚举$[l, r]$, 求其中0
的个数是否$\leq k$, 复杂度$\mathcal O(n^3)$
考虑优化, 如果用一个前缀和记录一下0
的个数, 可以优化到$\mathcal O(n^2)$, 但还是比较屑.
换个思路, 一个想法是对于一个含0
的区间,我们把0
都换掉一定是最优的.
那么考虑双指针维护一下当前找到的含0
个数$<k$中最大的区间, 如果右面还有0
那就动右指针, 区间内0
的个数$>$k就动左指针.
然后时间复杂度$\mathcal O(n)$, 不过至今不知道最优解是咋写的.
Code
Upd: 最近本人码风智障, 除快读部分的[]
都会被替换为<::>
1 | /* Headers */ |