描述
You are given an array a with n elements. Each element of a is either 0 or 1.
Let’s denote the length of the longest subsegment of consecutive elements in a, consisting of only numbers one, as f(a). You can change no more than k zeroes to ones to maximize f(a).
Input
The first line contains two integers n and k (1 ≤ n ≤ 3·105, 0 ≤ k ≤ n) — the number of elements in a and the parameter k.
The second line contains n integers ai (0 ≤ ai ≤ 1) — the elements of a.
Output
On the first line print a non-negative integer z — the maximal value of f(a) after no more than k changes of zeroes to ones.
On the second line print n integers aj — the elements of the array a after the changes.
If there are multiple answers, you can print any one of them.
Example
Input
7 1
1 0 0 1 1 0 1
Output
4
1 0 0 1 1 1 1
Input
10 2
1 0 0 1 0 1 0 1 0 1
Output
5
1 0 0 1 1 1 1 1 0 1
#include<stdio.h>
int n,k,t;bool a[300005];
bool check(int ans)
{
//ans为待检测的连续1的长度
//那么我们就找在ans长度内修改最小次数min 与k比较
int m=0,last=0,now=ans,min=n;
for(int j=0;j<ans;j++)
m+=a[j]^1;
for(int j=ans;j<=n;j++)
{
if(m<min) t=j,min=m;//用t记录最优解时的地方 方便输出
m+=(a[j]^1)-(a[j-ans]^1);
}
return min>k;// min>k 说明ans大了 取top=ans
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
int sum=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]),sum+=a[i];
int low=0,top=n;
if(sum+k>=n)//排除特殊情况
printf("%d\n",low=t=n);
else{
while(top-low>1)//寻找满足条件的最大值
{
int m=(top+low)>>1;
if(check(m))
top=m;
else
low=m;
}check(low); //再走一次获取有效的 t
printf("%d\n",low);
}
for(int i=0;i<n;i++)
{
if(i) printf(" ");
if(t-low<=i&&i<t) printf("1");
else printf("%d",a[i]);
}printf("\n");
}
return 0;
}