CodeForces

来源:互联网 发布:点云数据英文 编辑:程序博客网 时间:2024/06/05 01:18


题意就是 在这个数串中插入1构成一个最长的连续1的区间串


如何做?我们可以对长度进行二分

从1到n二分长度 然后在对这个长度拿到数串中查看是否能构成最终我们想要的最长匹配串

这里我们可以利用一个前缀和数组 统计从1到i的0的个数 由于必然是递增数组 就满足了二分

的“有序”条件 。


#include<bits/stdc++.h>using namespace std;int a[300010],s[300010];int n,k,L;bool che(int x){    for(int i=1;i<=n;i++)    {        int r = i+x-1;        if(r>n)return 0;        if(s[r]-s[i-1]<=k){//如果s[r]-s[i-1]<=k说明这两个下标下之间0的个数<=k也就说满足条件 就会返回1 并记录区间左端点            L = i;            return 1;        }    }    return 0;}int main(){    cin>>n>>k;    s[0]=0;     for(int i=1;i<=n;i++){         cin>>a[i];        s[i]=s[i-1]+(a[i]==0);    }    int M=0,u=0;    int l = 1,r=n;    while(l<=r)    {        int mid = (l+r)>>1;        if(che(mid))        {// 如果这里返回1 说明区间满足条件 就会记录长度 尝试更长的长度             u = mid;            l = mid+1;        }        else r = mid-1;// 不满足条件 说明数串长度过长 需要截短    }    for(int i=L;i<=L+u-1;i++)    a[i]=1;    cout<<u<<endl;    for(int i=1;i<=n;i++)    {        cout<<a[i];        if(i==n)puts("");        else cout<<" ";    }    return 0;}