Hard Process
题目链接:CodeForces - 660C
题意:只由0,1组成的数列,找出只包含1的最长子序列,同时可以将任意不超过k个0变为1,使得只包含1的子序列变长;然后输出改变后的数列;
思路:二分长度;
#include <bits/stdc++.h>
using namespace std;
const int maxn=300010;
int a[maxn], n, k, sum[maxn];
bool cal(int x){
for(int i=1; i+x-1<=n; i++){
if(sum[i+x-1]-sum[i-1]<=k) return true;
}
return false;
}
int main(){
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
}
sum[0]=0;
for(int i=1; i<=n; i++){
if(a[i]) sum[i]=sum[i-1];
else sum[i]=sum[i-1]+1;
}
int l=0, r=n, ans=0;
while(l<=r){
int mid=(l+r)/2;
if(cal(mid)){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%d\n", ans);
for(int i=1; i+ans-1<=n; i++){
if(sum[i+ans-1]-sum[i-1]<=k){
for(int j=1; j<=n; j++){
if(j>=i&&j<=i+ans-1) printf("1");
else printf("%d", a[j]);
printf("%c", j==n?'\n':' ');
}
break;
}
}
return 0;
}