Submission #583935

#TimeUsernameProblemLanguageResultExecution timeMemory
583935KanaifuJJOOII 2 (JOI20_ho_t2)C++17
100 / 100
18 ms2864 KiB
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define fr first
#define sc second

int n, k;
int pref1[200001], pref2[200001], pref3[200001];

int bin_search1(int val)
{
    int l = 1, r = n;
    while(l<=r)
    {
        int mid = ((l+r)>>1);
        if (pref1[mid] < val)
        {
            l = mid+1;
        }
        else
        {
            r = mid - 1;
            if (pref1[mid] < val)
            {
                return mid;
            }
        }
    }
    if (l>n)
    {
        return -1;
    }
    return l;
}

int bin_search2(int val)
{
    int l = 1, r = n;
    while(l<=r)
    {
        int mid = ((l+r)>>1);
        if (pref2[mid] < val)
        {
            l = mid+1;
        }
        else
        {
            r = mid - 1;
            if (pref2[mid] < val)
            {
                return mid;
            }
        }
    }
    if (l>n)
    {
        return -1;
    }
    return l;
}

int bin_search3(int val)
{
    int l = 1, r = n;
    while(l<=r)
    {
        int mid = ((l+r)>>1);
        if (pref3[mid] < val)
        {
            l = mid+1;
        }
        else
        {
            r = mid - 1;
            if (pref3[mid] < val)
            {
                return mid;
            }
        }
    }
    if (l>n)
    {
        return -1;
    }
    return l;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);

    cin>>n>>k;

    pref1[0] = 0;
    pref2[0] = 0;
    pref3[0] = 0;

    for (int i=1; i<=n; i++)
    {
        char c;
        cin>>c;
        pref1[i] = pref1[i-1];
        pref2[i] = pref2[i-1];
        pref3[i] = pref3[i-1];
        if (c == 'J')
        {
            pref1[i]++;
        }
        else if (c == 'O')
        {
            pref2[i]++;
        }
        else
        {
            pref3[i]++;
        }
    }

    int mn = 1e9;

    for (int i=1; i<=n; i++)
    {
        int st = pref1[i];

        int poz2;
        if (pref1[i-1] == pref1[i])
        {
            continue;
        }
        poz2 = bin_search1(st+k-1);
        if (poz2 == -1)
        {
            continue;
        }

        st = pref2[poz2];
        int poz3 = bin_search2(st+k);

        if (poz3 == -1)
        {
            continue;
        }

        st = pref3[poz3];

        int kraj = bin_search3(st+k);

        if (kraj == -1)
        {
            continue;
        }
        mn = min(mn, kraj - i + 1 - 3 * k);
    }
    if (mn == 1e9)
    {
        cout<<-1;
        return 0;
    }
    cout<<mn;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...