123
[题意]
把不超过k个的0 变成1 使1 的长度最大.
[思路]
用二分的方法, 二分区间,确定长度.特别好的思路, 还有用迟取法也是可以的. 这里用二分, 二分是个很玄学的东西.
把区间二分后, 从0-n-mid判断 加上k个是否满足. 记录 开始值 i 为了 记录数组用
[代码实现]
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <vector>
#define mem(a,b) memset(a,b,sizeof(a))
#define findx(x,b,n) lower_bound(b+1,b+1+n,x)-b
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
#define SHUT ios_base::sync_with_stdio(false); cout.setf(ios::fixed); cout.precision(20); cout.tie(nullptr); cin.tie(nullptr);
#define lson rt << 1, l, mid
#define rson rt << 1|1, mid + 1, r
#define FI(n) IO::read(n)
#define Be IO::begin()
using namespace std;
typedef long long ll;
const double PI=acos(-1);
const int INF=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int MAXN=300005;
const int MOD=1e9+7;
const int mod=1e9+7;
int dir[5][2]={0,1,0,-1,1,0,-1,0};
int a[MAXN];
int sum[MAXN];
int n,k;
int temp;
int judge(int mid)
{
for(int i=0;i<=n-mid;i++)
{
if(sum[i+mid]-sum[i]+k>=mid)
{
temp=i;
return 1;
}
}
return 0;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+(a[i]==1);
}
temp=-1;
int l=0,r=n+1;
while(l+1<r)
{
int mid=(l+r)>>1;
if(judge(mid))
l=mid;
else
r=mid;
}
cout<<l<<endl;
//cout<<temp<<endl;
for(int i=1;i<=temp;i++)
cout<<a[i]<<" ";
for(int i=temp+1;i<=temp+l;i++)
cout<<"1 ";
for(int i=max(temp+l+1,1);i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}