Submission #206967

#TimeUsernameProblemLanguageResultExecution timeMemory
206967wiwihoJJOOII 2 (JOI20_ho_t2)C++14
100 / 100
38 ms3136 KiB
//#define NDEBUG #include <bits/stdc++.h> #include <bits/extc++.h> #define StarBurstStream ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define iter(a) a.begin(), a.end() #define riter(a) a.rbegin(), a.rend() #define lsort(a) sort(iter(a)) #define gsort(a) sort(riter(a)) #define mp(a, b) make_pair(a, b) #define pb(a) push_back(a) #define eb(a) emplace_back(a) #define pf(a) push_front(a) #define pob pop_back() #define pof pop_front() #define F first #define S second #define printv(a, b) {bool pvaspace=false; \ for(auto pva : a){ \ if(pvaspace) b << " "; pvaspace=true;\ b << pva;\ }\ b << "\n";} #define pii pair<int, int> #define pll pair<ll, ll> #define tiii tuple<int, int, int> #define mt make_tuple #define gt(t, i) get<i>(t) #define iceil(a, b) ((a) / (b) + !!((a) % (b))) //#define TEST typedef long long ll; typedef unsigned long long ull; using namespace std; using namespace __gnu_pbds; const ll MOD = 1000000007; const ll MAX = 2147483647; template<typename A, typename B> ostream& operator<<(ostream& o, pair<A, B> p){ return o << '(' << p.F << ',' << p.S << ')'; } int main(){ StarBurstStream int n, k; cin >> n >> k; string s; cin >> s; s = ' ' + s; vector<int> J(n + 1), O(n + 1), I(n + 1); for(int i = 1; i <= n; i++){ if(s[i] == 'J') J[i]++; else if(s[i] == 'O') O[i]++; else I[i]++; J[i] += J[i - 1]; O[i] += O[i - 1]; I[i] += I[i - 1]; } int ans = MAX; for(int i = 1; i <= n && J[n] - J[i - 1] >= k && O[n] - O[i - 1] >= k && I[n] - I[i - 1] >= k; i++){ int l = lower_bound(iter(J), J[i - 1] + k) - J.begin(); if(O[n] - O[l] < k || I[n] - I[l] < k) continue; int m = lower_bound(iter(O), O[l] + k) - O.begin(); if(I[n] - I[m] < k) continue; int r = lower_bound(iter(I), I[m] + k) - I.begin(); int now = 0; now += J[l] - J[i - 1] - k + O[l] - O[i - 1] + I[l] - I[i - 1]; now += J[m] - J[l] + O[m] - O[l] - k + I[m] - I[l]; now += J[r] - J[m] + O[r] - O[m] + I[r] - I[m] - k; ans = min(ans, now); } if(ans == MAX) ans = -1; cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...