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 test1 second memory limit per test256 megabytes inputstandard inpu...

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

C. Hard Process time limit per test 1 second memory limit per test 256 megabytes in...

Codeforces 660C Hard Process【二分】经典题!好题!

C. Hard Process time limit per test 1 second memory limit per test 256 megabytes input standard i...

codeforces802C Heidi and Library (hard) -- 费用流

题目大意:每天会有一个客人来图书馆,共n天,第i个客人要看的书是ai。 为了保证每个客人都能读到想要的书,你可以在任意时间去商店买书并放入图书馆或者从图书馆里丢掉几本书,图书馆里最多只能有k本书。...
  • gjghfd
  • gjghfd
  • 2017年05月30日 10:27
  • 256

CodeForces 688C-NP-Hard Problem(dfs)

C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input sta...

Codeforces Round #360 (Div. 2) -- C. NP-Hard Problem (DFS二分图染色法)

C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa...

Codeforces #367(Div.2)C.Hard problem【dp】

C. Hard problem time limit per test  1 second memory limit per test  256 megabytes ...

Codeforces Round #367 (Div. 2) C. Hard problem(简单DP)

C. Hard problem time limit per test1 second memory limit per test256 megabytes inputstandard inpu...

CodeForces 706C Hard problem【dp】

Description Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve ...
  • Bcwan_
  • Bcwan_
  • 2016年10月19日 01:46
  • 106

CodeForces-688C.NP-Hard Problem

Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces 660C Hard Process
举报原因:
原因补充:

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