codeforces 660C Hard Process

原创 2016年06月01日 19:06:00


You are given an array a with n elements. Each element of a is either 0 or 1.

Let's denote the length of the longest subsegment of consecutive elements in a, consisting of only numbers one, as f(a). You can change no more than k zeroes to ones to maximize f(a).

Input

The first line contains two integers n and k (1 ≤ n ≤ 3·105, 0 ≤ k ≤ n) — the number of elements in a and the parameter k.

The second line contains n integers ai (0 ≤ ai ≤ 1) — the elements of a.

Output

On the first line print a non-negative integer z — the maximal value of f(a) after no more than k changes of zeroes to ones.

On the second line print n integers aj — the elements of the array a after the changes.

If there are multiple answers, you can print any one of them.

Sample Input

Input
7 1
1 0 0 1 1 0 1
Output
4
1 0 0 1 1 1 1
Input
10 2
1 0 0 1 0 1 0 1 0 1
Output
5
1 0 0 1 1 1 1 1 0 1
题意: 给你N个数,让你改变其中的K个0为1;使得连1的长度最长
思路:把它看成是花费得到每个点对于第一个点的花费dp[i],按照二分查找的思想来写,在每一个位置上去找当前花费dp[i]+k的最小值所在的位置来记录比较
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>

using namespace std;

int n,k;
int dp[300005];
int a[300005];

int main() {
    memset(dp,0,sizeof(dp));
    cin >> n >> k;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] == 0) {
            dp[i] = dp[i-1]+1;
        } else {
            dp[i] = dp[i-1];
        }
    }
    int ans = 0;
    int s = 0;
    for(int i = 1; i <= n; i++) {
        int index;
        if(a[i] == 0) {//当前值为0说明当前的花费有一个
            index = upper_bound(dp,dp+n+1,dp[i]+k-1)-dp;
        } else {
            index = upper_bound(dp,dp+n+1,dp[i]+k)-dp;
        }
        if(index - i > ans) {
            ans = index-i;
            s = i;
        }
    }
    printf("%d\n",ans);
    int i;
    for(i = 1; i < s; i++) {
        printf("%d ",a[i]);
    }
    for(; i <= n && k != 0; i++) {
        printf("1 ");
        if(a[i] == 0) {
            k--;
        }
    }
    for(; i<= n; i++) {
        printf("%d ",a[i]);
    }
    return 0;
}
有进步啦

版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces 660C-Hard Process【尺取法经典练习】

C. Hard Process time limit per test 1 second memory limit per test 256 megabytes in...
  • qq_29600137
  • qq_29600137
  • 2016年05月03日 11:58
  • 594

CodeForces - 660C Hard Process (二分)好题

CodeForces - 660C Hard Process Time Limit: 1000MS   Memory Limit: 262144KB   64bit...
  • yanghui07216
  • yanghui07216
  • 2016年04月13日 21:41
  • 455

codeforces 660C Hard Process

又不会,又去看了官方的题解。 题目的意思是,给出一个由0和1构成的数组,然后替换其中的k个数字,使得有一个连续由1构成的字串长度最长。用了两个数,表示当前最优的范围,声明了一个变量cnt,用来记录在前...
  • MrSiz
  • MrSiz
  • 2016年05月01日 14:30
  • 297

CodeForces 660C Hard Process

给定一个数组 a,含有 n 个元素。数组 a 中的每个元素要么是 0,要么是 1 。 让我们假定,数组 a 中,仅由数字 1 组成的连续元素所构成的子分段,其最长的长度为 f(a)。您可以将不超过 ...
  • CS33sun
  • CS33sun
  • 2018年01月30日 11:18
  • 56

CodeForces 660C Hard Process

题意:你有n个非0就是1的数字,你可以修改最多k个,使得0变成1,然后问你修改之后,最长的连续1的串是多长? 思路:维护一个前缀0的个数,然后对于每个位置,直接暴力二分就好了,二分这个位置最远能够延...
  • qq_21057881
  • qq_21057881
  • 2016年04月18日 23:26
  • 213

CodeForces - 660C Hard Process

题意就是 在这个数串中插入1构成一个最长的连续1的区间串 如何做?我们可以对长度进行二分 从1到n二分长度 然后在对这个长度拿到数串中查看是否能构成最终我们想要的最长匹配串 这里我们可以...
  • qq_33859479
  • qq_33859479
  • 2017年06月12日 22:31
  • 61

【CodeForces】660C - Hard Process(二分,尺取法)

点击打开题目 C. Hard Process time limit per test 1 second memory limit per tes...
  • wyg1997
  • wyg1997
  • 2016年07月18日 09:26
  • 231

Hard Process CodeForces - 660C (尺取法)

You are given an array a with n elements. Each element of a is either 0 or 1.Let’s denote the length...
  • zhuanshunzhe
  • zhuanshunzhe
  • 2017年05月25日 21:38
  • 66

Codeforces 660C Hard Process 【二分】

题目链接:Codeforces 660C Hard Process C. Hard Process time limit per test1 second memory limit per t...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2016年04月13日 22:05
  • 499

CodeForces 660C Hard Process (队列)

Description You are given an array a with n elements. Each element of a is either 0 or 1. Let...
  • Forever_wjs
  • Forever_wjs
  • 2016年04月22日 16:10
  • 279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces 660C Hard Process
举报原因:
原因补充:

(最多只允许输入30个字)