预处理前缀和+枚举起点+二分终点。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=300000+10; int n,k; int a[maxn],sum[maxn]; int work(int st) { int l=st,r=n; int res=-1; while(l<=r) { int mid=(l+r)/2; if(sum[mid]-sum[st-1]<=k) { res=mid; l=mid+1; } else r=mid-1; } return res; } int main() { scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) scanf("%d",&a[i]); if(a[1]==0) sum[1]=1; for(int i=2; i<=n; i++) { sum[i]=sum[i-1]; if(a[i]==0) sum[i]++; } int ans=0; int L,R; int flag=0; for(int i=1; i<=n; i++) { int tmp=work(i); if(tmp==-1) continue; if(tmp-i+1>ans) { ans=tmp-i+1; L=i; R=tmp; flag=1; } } if(flag==0) { printf("%d ",0); for(int i=1; i<=n; i++) printf("%d ",a[i]); printf(" "); } else { printf("%d ",ans); for(int i=1; i<L; i++) printf("%d ",a[i]); for(int i=L; i<=R; i++) printf("1 "); for(int i=R+1; i<=n; i++) printf("%d ",a[i]); printf(" "); } return 0; }