Description
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.
Sample Input
7 1 1 0 0 1 1 0 1
4 1 0 0 1 1 1 1
10 2 1 0 0 1 0 1 0 1 0 1
5 1 0 0 1 1 1 1 1 0 1
题意:给出01数列和能将0变成1的次数,问最长的连续1的数列
解析:从左到右扫数列,每一个值都存入队列中,队列中保证次数小于等于最大变换次数,取最大长度即可。
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<cmath>
#include<vector>
//#pragma comment(linker, "/STACK:1024000000,1024000000");
using namespace std;
#define INF 0x3f3f3f3f
int a[300005];
int que[300005];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int l=-1,r=-1,ans=0;
int sum=0;
int s=0,t=-1;
for(int i=0;i<n;i++)
{
if(a[i]) que[++t]=a[i];
else
{
if(sum==k)
{
while(sum==k)
{
sum-=(1^que[s++]);
}
}
que[++t]=a[i];
sum++;
}
if(t-s+1>ans) ans=t-s+1,r=i,l=r-(t-s+1)+1;
}
printf("%d\n",ans);
for(int i=0;i<n-1;i++)
{
if(i>=l&&i<=r) printf("1 ");
else printf("%d ",a[i]);
}
if(n-1>=l&&n-1<=r) printf("1\n");
else printf("%d\n",a[n-1]);
}
return 0;
}