Cod sursa(job #2685554)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 17 decembrie 2020 10:56:41
Problema Infasuratoare convexa Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

ifstream fin("blis.in");
ofstream fout("blis.out");

void max_self(int &a, int b) {
    a = max(a, b);
}

void min_self(int &a, int b) {
    a = min(a, b);
}

int main() {
    int K;
    string s;
    fin >> K >> s;
    int N = s.size();
    s = '0' + s;
    vector<int> dp(N + 2, INF);
    vector<vector<pair<int,int>>> upd(N + 1);
    dp[0] = -INF;
    int ans = 0;
    for(int i = 1; i <= N; ++i) {
        int val = 0, up = min(N, i + K - 1);
        for(int j = i; j <= up; ++j) {
            val = val * 2 + (s[j] - '0');
            max_self(ans, val);
            int st = 0, dr = i - 1, poz = 0;
            while(st <= dr) {
                int mid = (st + dr) >> 1;
                if(dp[mid] < val) {
                    poz = mid;
                    st = mid + 1;
                }
                else
                    dr = mid - 1;
            }
            ++poz;
            if(dp[poz] > val)
                upd[j].emplace_back(poz, val);
        }
        for(auto x : upd[i])
            min_self(dp[x.first], x.second);
    }
    int sol = 0;
    for(int i = N; i > 0 && !sol; --i)
        if(dp[i] != INF)
            sol = i;
    fout << ans << '\n' << sol;
}