제출 #1222181

#제출 시각아이디문제언어결과실행 시간메모리
1222181giorgi123glmJJOOII 2 (JOI20_ho_t2)C++20
100 / 100
318 ms216696 KiB
#include <algorithm>
#include <functional>
#include <iostream>
#include <list>
#include <map>
using namespace std;

#define int long long

signed main () {
    ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);

    int N = 0, K = 0;
    cin >> N >> K;

    string str = "";
    cin >> str;

    str = " " + str;

    vector <int> nJ (N + 2);
    nJ[N] = nJ[N + 1] = N + 1;
    for (int i = N - 1; i >= 1; i--)
        if (str[i + 1] == 'J')
            nJ[i] = i + 1;
        else
            nJ[i] = nJ[i + 1];

    vector <vector <pair <int, int> > > binJ (
        N + 2,
        vector <pair <int, int> > (20)
    );
    for (int p = 0; p <= 19; p++)
        if (p == 0)
            for (int i = N + 1; i >= 1; i--)
                binJ[i][0] = {nJ[i], nJ[i] - i - 1};
        else
            for (int i = N + 1; i >= 1; i--)
                binJ[i][p] = {
                    binJ[
                        binJ[i][p - 1].first
                    ][p - 1].first,
                    binJ[i][p - 1].second +
                    binJ[
                        binJ[i][p - 1].first
                    ][p - 1].second
                };

    vector <int> nO (N + 2);
    nO[N] = nO[N + 1] = N + 1;
    for (int i = N - 1; i >= 1; i--)
        if (str[i + 1] == 'O')
            nO[i] = i + 1;
        else
            nO[i] = nO[i + 1];

    vector <vector <pair <int, int> > > binO (
        N + 2,
        vector <pair <int, int> > (20)
    );
    for (int p = 0; p <= 19; p++)
        if (p == 0)
            for (int i = N + 1; i >= 1; i--)
                binO[i][0] = {nO[i], nO[i] - i - 1};
        else
            for (int i = N + 1; i >= 1; i--)
                binO[i][p] = {
                    binO[
                        binO[i][p - 1].first
                    ][p - 1].first,
                    binO[i][p - 1].second +
                    binO[
                        binO[i][p - 1].first
                    ][p - 1].second
                };

    vector <int> nI (N + 2);
    nI[N] = nI[N + 1] = N + 1;
    for (int i = N - 1; i >= 1; i--)
        if (str[i + 1] == 'I')
            nI[i] = i + 1;
        else
            nI[i] = nI[i + 1];

    vector <vector <pair <int, int> > > binI (
        N + 2,
        vector <pair <int, int> > (20)
    );
    for (int p = 0; p <= 19; p++)
        if (p == 0)
            for (int i = N + 1; i >= 1; i--)
                binI[i][0] = {nI[i], nI[i] - i - 1};
        else
            for (int i = N + 1; i >= 1; i--)
                binI[i][p] = {
                    binI[
                    binI[i][p - 1].first
                    ][p - 1].first,
                    binI[i][p - 1].second +
                    binI[
                        binI[i][p - 1].first
                    ][p - 1].second
                };

    int actans = 2e9;
    for (int i = N - 2; i >= 1; i--)
        if (str[i] == 'J') {
            int ind = i;
            int ans = 0;

            for (int p = 19; p >= 0; p--)
                if ((K - 1) & (1 << p)) {
                    ans += binJ[ind][p].second;
                    ind = binJ[ind][p].first;
                }
            for (int p = 19; p >= 0; p--)
                if (K & (1 << p)) {
                    ans += binO[ind][p].second;
                    ind = binO[ind][p].first;
                }
            for (int p = 19; p >= 0; p--)
                if (K & (1 << p)) {
                    ans += binI[ind][p].second;
                    ind = binI[ind][p].first;
                }

            if (ind <= N)
                actans = min (actans, ans);
        }
    
    if (actans == 2e9)
        cout << -1 << '\n';
    else
        cout << actans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...