Hard Process

来源:互联网 发布:淘宝千里眼怎么用 编辑:程序博客网 时间:2024/05/29 11:45

Hard Process  CodeForces - 660C

        You are given an array a with n elements. Each element of a is either0 or 1.

        Let's denote the length of the longest subsegment of consecutive elements ina, consisting of only                 numbers one, asf(a). You can change no more thank zeroes to ones to maximize f(a).

Input

The first line contains two integers n andk (1 ≤ n ≤ 3·105, 0 ≤ k ≤ n) — the number of elements ina and the parameter k.

The second line contains n integers ai (0 ≤ ai ≤ 1) — the elements ofa.

Output

On the first line print a non-negative integer z — the maximal value off(a) after no more than k changes of zeroes to ones.

On the second line print n integers aj — the elements of the arraya after the changes.

If there are multiple answers, you can print any one of them.

Example
Input
7 11 0 0 1 1 0 1
Output
41 0 0 1 1 1 1
Input
10 21 0 0 1 0 1 0 1 0 1
Output
51 0 0 1 1 1 1 1 0 1

题意:给一个数列,数列中元素只有 1 和 0 。该数列可以把 0 改成 1,最多改变 k 个。经过更改后得到一个最大连续的子数列,数列中所有的元素都为 1 ,输出该子数列的长度并输出更改后的数列。

思路:二分法,本人先是二分再循环,二分最大长度,但判断时使用了双重循环,故超时了。网上看了点击打开链接这个博客受到了启发。运用了nlogn的形式,先进行循环,在二分。

代码:

#include<stdio.h>int a[300005], sum[300005];int main(){int n, k, i, l, r, mid, s, e, max;while (~scanf("%d%d", &n, &k)){sum[0] = max = 0;for (i = 1; i <= n; i++){scanf("%d", &a[i]);sum[i] = sum[i - 1] + a[i];}for (i = 1; i <= n; i++)//从第一个开始,二分得出从此开始能够得到最大长度,得到最大的并记录该子数列初末地址{l = 0, r = n - i + 2, mid = (l + r) / 2;while (r - l > 1){if (sum[i + mid - 1] - sum[i - 1] + k >= mid) l = mid;else r = mid;mid = (l + r) / 2;}if (l > max) {max = l;s = i;e = i + max - 1;}}printf("%d\n", max);for (i = 1; i <= n; i++){if (i >= s && i <= e) printf("1 ");else printf("%d ", a[i]);}printf("\n");}return 0;}


原创粉丝点击