Submission #1234564

#TimeUsernameProblemLanguageResultExecution timeMemory
1234564antromancapJJOOII 2 (JOI20_ho_t2)C++20
100 / 100
20 ms4164 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;
int n, k, c[N][3];
char a[N];
vector<int> v[3];

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

	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		copy(c[i - 1], c[i - 1] + 3, c[i]);
		if (a[i] == 'J') c[i][0]++, v[0].push_back(i);
		if (a[i] == 'O') c[i][1]++, v[1].push_back(i);
		if (a[i] == 'I') c[i][2]++, v[2].push_back(i);
	}
	v[0].push_back(n + 1);
	v[1].push_back(n + 1);
	v[2].push_back(n + 1);

	int res = N;
	for (int i = 1; i <= n; i++) {
		if (a[i] != 'J') continue;
		int l = i, r = n;
		while (l <= r) {
			int m = (l + r) >> 1;
			if (c[m][0] - c[i - 1][0] >= k) r = m - 1;
			else l = m + 1;
		}
		if (l > n) continue;
		l = v[1][lower_bound(v[1].begin(), v[1].end(), l) - v[1].begin()];
		int l2 = l, r2 = n;
		while (l2 <= r2) {
			int m = (l2 + r2) >> 1;
			if (c[m][1] - c[l - 1][1] >= k) r2 = m - 1;
			else l2 = m + 1;
		}
		if (l2 > n) continue;
		l2 = v[2][lower_bound(v[2].begin(), v[2].end(), l2) - v[2].begin()];
		int l3 = l2, r3 = n;
		while (l3 <= r3) {
			int m = (l3 + r3) >> 1;
			if (c[m][2] - c[l2 - 1][2] >= k) r3 = m - 1;
			else l3 = m + 1;
		}
		if (l3 > n) continue;
		res = min(res, l3 - i + 1 - 3 * k);
	}
	cout << (res == N ? -1 : res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...