Submission #244860

#TimeUsernameProblemLanguageResultExecution timeMemory
244860NightlightJJOOII 2 (JOI20_ho_t2)C++14
100 / 100
36 ms2944 KiB
#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;

int N, K;
int sumJ[200005];
int sumO[200005];
int sumI[200005];
int cntJ, cntO, cntI;

void calc(int l, int r) {
  cntJ = sumJ[r] - sumJ[l - 1];
  cntO = sumO[r] - sumO[l - 1];
  cntI = sumI[r] - sumI[l - 1];
}

int main() {
  ios_base::sync_with_stdio(0);
  cin >> N >> K;
  char ch;
  for(int i = 1; i <= N; i++) {
    cin >> ch;
    if(ch == 'J') {
      sumJ[i] = 1;
    }else if(ch == 'O') {
      sumO[i] = 1;
    }else {
      sumI[i] = 1;
    }
    sumJ[i] += sumJ[i - 1];
    sumO[i] += sumO[i - 1];
    sumI[i] += sumI[i - 1];
  }
  int ans = 1e9;
  for(int i = 1; i <= N; i++) {
    int l = i, r = N, res = -1;
//    cout << i << "\n";
    //binser J
    while(l <= r) {
      int mid = (l + r) >> 1;
      calc(i, mid);
      if(cntJ >= K) {
        res = mid;
        r = mid - 1;
      }else {
        l = mid + 1;
      }
    }
//    cout << res << " J\n";
    if(res == -1) break;
    //binser O
    int bef = res + 1;
    l = res + 1, r = N, res = -1;
    while(l <= r) {
      int mid = (l + r) >> 1;
      calc(bef, mid);
      if(cntO >= K) {
        res = mid;
        r = mid - 1;
      }else {
        l = mid + 1;
      }
    }
//    cout << res << " O\n";
    if(res == -1) break;
    //binser I
    bef = res + 1;
    l = res + 1, r = N, res = -1;
    while(l <= r) {
      int mid = (l + r) >> 1;
      calc(bef, mid);
      if(cntI >= K) {
        res = mid;
        r = mid - 1;
      }else {
        l = mid + 1;
      }
    }
//    cout << res << " I\n";
    if(res == -1) break;
    ans = min(ans, res - i + 1 - K * 3);
  }
  if(ans != 1e9) cout << ans << "\n";
  else cout << "-1\n";
  cin >> N;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...