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...