제출 #653129

#제출 시각아이디문제언어결과실행 시간메모리
653129pauloamedJJOOII 2 (JOI20_ho_t2)C++14
100 / 100
58 ms3316 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN = 200010; int J[MAXN], O[MAXN], I[MAXN]; int N, K; string s; int bb(int v[], int x){ // achar ultimo cara i, v[i] < x if(v[0] >= x) return 0; int ans = 0; int pot = (1 << 30); while(pot){ int mans = ans + pot; if(mans < N && v[mans] < x) ans = mans; pot /= 2; } if(ans + 1 == N) return -1; else return ans + 1; } int solveI(int i){ if(i == N) return -1; int prev = I[i - 1]; int nxt = bb(I, prev + K); if(nxt == -1) return -1; int cost = (nxt - i + 1) - K; return cost; } int solveO(int i){ if(i == N) return -1; int prev = O[i - 1]; int nxt = bb(O, prev + K); if(nxt == -1) return -1; int cost = (nxt - i + 1) - K; int x; if((x = solveI(nxt + 1)) == -1) return -1; return cost + x; } int solveJ(int i){ // starting from i int prev = 0; if(i > 0) prev = J[i - 1]; int nxt = bb(J, prev + K); if(nxt == -1) return -1; int cost = (nxt - i + 1) - K; int x; if((x = solveO(nxt + 1)) == -1) return -1; return cost + x; } int32_t main(){ cin.tie(NULL)->sync_with_stdio(false); cin >> N >> K; cin >> s; for(int i = 0; i < N; ++i){ J[i] = (s[i] == 'J'); O[i] = (s[i] == 'O'); I[i] = (s[i] == 'I'); if(i){ J[i] += J[i - 1]; O[i] += O[i - 1]; I[i] += I[i - 1]; } } int ans = INT_MAX; for(int i = 0; i < N; ++i){ int x = solveJ(i); if(x == -1) break; // cout << i << " " << x << "\n"; ans = min(ans, x); } cout << ((ans == INT_MAX)? -1 : ans) << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...