维护一个左右区间指针就可以。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<queue> 5 #include<stack> 6 using namespace std; 7 int main(){ 8 int n,m; 9 int a[300010]; 10 while(~scanf("%d%d",&n,&m)){ 11 for(int i=1;i<=n;i++) 12 scanf("%d",&a[i]); 13 int l,r,k,rr,ll; 14 l=1,r=0,rr=-1,ll=0,k=0; 15 while(r<=n){ 16 if(rr-ll<r-l){ 17 rr=r; 18 ll=l; 19 } 20 if(a[++r]==0){ 21 k++; 22 } 23 while(k>m){ 24 if(a[l++]==0){ 25 k--; 26 } 27 } 28 } 29 printf("%d ",rr-ll+1); 30 for (int i = ll; i <= rr ; ++i) 31 { 32 /* code */ 33 a[i]=1; 34 } 35 for(int i=1;i<=n;i++){ 36 printf("%d ",a[i]); 37 } 38 } 39 return 0; 40 }