0w1

CFR 660 C. Hard Process ( Binary Search )

Problem - 660C - Codeforces
題意:
給 0, 1 組成的序列,求修改至多 K 個數字之後的最長連續 1 子序列長度,及整體長相。
解法:
預處理前綴和,接著二分搜答案。每次確認答案是否對只需要 O( N )。

int N, K;
vi A;

void init(){
    cin >> N >> K;
    A = vi( N );
    for( int i = 0; i < N; ++i )
        cin >> A[ i ];
}

vi pA;

void preprocess(){
    pA = vi( N + 1 );
    for( int i = 0; i < N; ++i )
        pA[ i + 1 ] = pA[ i ] + !A[ i ];
}

void solve(){
    int lb = 0, ub = N;
    int ans = -1;
    while( lb <= ub ){
        int mid = lb + ub >> 1;

        int ok = 0;
        for( int i = mid; i <= N; ++i )
            if( pA[ i ] - pA[ i - mid ] <= K )
                ok = 1;

        if( ok )
            ans = mid, lb = mid + 1;
        else
            ub = mid - 1;
    }
    cout << ans << endl;
    for( int i = ans; i <= N; ++i )
        if( pA[ i ] - pA[ i - ans ] <= K ){
            for( int j = 0; j < i - ans; ++j )
                cout << A[ j ] << " ";
            for( int j = i - ans; j < i; ++j )
                cout << 1 << " ";
            for( int j = i; j < N; ++j )
                cout << A[ j ] << " ";
            return;
        }
}