CodeForces 660C Hard Process (队列)

来源:互联网 发布:淘宝外围活动怎么参加 编辑:程序博客网 时间:2024/06/06 09:31

Description

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 in a, consisting of only numbers one, as f(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.

Sample Input

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


题意:给出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 0x3f3f3f3fint 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;}


0 0