Submission #367204

#TimeUsernameProblemLanguageResultExecution timeMemory
367204piddddgyJJOOII 2 (JOI20_ho_t2)C++11
100 / 100
32 ms5684 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define cerr if(false) cerr
#define watch(x) cerr << (#x) << " is " << (x) << endl;
#define endl '\n'
#define ld long double
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define sz(a) (int)(a).size()
#define all(x) (x).begin(), (x).end()

const int maxn = 200500;

int n, k;
string s;
int psa[5][maxn];

int query(int i, int l, int r) {
    return psa[i][r] - psa[i][l-1];
}

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

    cin >> n >> k;
    cin >> s;

    s = "."+s;

    for(int i = 1; i <= n; i++) {
        if(s[i] == 'J') psa[1][i]++;
        if(s[i] == 'O') psa[2][i]++;
        if(s[i] == 'I') psa[3][i]++;
    }

    for(int i = 1; i <= 3; i++) {
        for(int j = 1; j <= n; j++) {
            psa[i][j] += psa[i][j-1];
        }
    }

    int ans = 1e18;

    // start j from i
    for(int i = 1; i <= n; i++) {
        int l = 1, r = n;
        int lg = -1;
        
        while(l <= r) {
            int mid = (l+r)/2;

            if(query(1, i, mid) >= k) {
                r = mid-1;
                lg = mid;
            } else {
                l = mid+1;
            }
        }

        if(lg == -1) continue;

        int lst = lg;
        l = lst+1, r = n;
        lg = -1;

        while(l <= r) {
            int mid = (l+r)/2;

            if(query(2, lst+1, mid) >= k) {
                r = mid-1;
                lg = mid;
            } else {
                l = mid+1;
            }
        }

        if(lg == -1) continue;

        lst = lg;
        l = lst+1, r = n;
        lg = -1;

        while(l <= r) {
            int mid = (l+r)/2;

            if(query(3, lst+1, mid) >= k) {
                r = mid-1;
                lg = mid;
            } else {
                l = mid+1;
            }
        }

        if(lg == -1) continue;

        ans = min(ans, lg-i+1 - 3*k);
    }

    if(ans == 1e18) {
        cout << -1 << endl;
    } else {
        cout << ans << endl;
    }
}

/*

find smallest subarray with k-level JOI as subsequence

bsearch

10 2
OJIJOIOIIJ

9 3
JJJOOOIII

9 3
IIIOOOJJJ



Did you read the bounds?
Did you make typos?
Are there edge cases (N=1?)
Are array sizes proper?
Integer overflow?
DS reset properly between test cases?
Is using long longs causing TLE?
Are you using floating points?
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...