#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, k, t;
string tab;
int solve() {
int meetOnlineCount=0, meetBiuroCount=0;
vector<int> meetingOnline;
for (int i = 0; i < n; ++i) { //Zliczanie spotkań
if (tab[i] == '1') meetBiuroCount++;
if (tab[i] == '2') {
meetOnlineCount++;
meetingOnline.push_back(i);
}
}
int res = -1;
for (int i1 = 0; i1 <= n-(2*t); ++i1) {
if (i1 == n - (2 * t)) i1 = n + 1;
int i2 = n-t;
int caughBiuro = 0, caughtOnline = 0, free = 0;
int lastOnline = -1;
int ratio = -(meetBiuroCount - k);
for (int j = 0; j < n; ++j) { //Zliczanie spotkań
if (tab[j] == '2') lastOnline++;
if (j < i1 || j >= i2+t) {
if (tab[j] != '2') free++;
if (tab[j] == '2') caughtOnline++;
} else if (j >= i1+t && j < i2) {
if (tab[j] != '3') caughBiuro++;
if (tab[j] == '1') ratio++;
if (lastOnline+ratio+1 >= 0 && (lastOnline+ratio+1 >= meetOnlineCount || meetingOnline[lastOnline+ratio+1] > j+t)) i2 = j+1;
} else {
if (tab[j] == '2') ratio--;
}
//cout << ratio << ' ' << j << ' ' << lastOnline << ' ' << meetingOnline[lastOnline] << ' ' << i2 << '\n';
}
if (0 <= ratio) {
free += min(ratio, caughtOnline);
res = max(res, free);
}
//cout << ' '<< ratio << ' '<< free << endl;
}
return res;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
//srand(time(NULL));
cin >> n >> k >> t;
cin >> tab;
cout << solve();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <bits/stdc++.h> using namespace std; #define int long long int n, k, t; string tab; int solve() { int meetOnlineCount=0, meetBiuroCount=0; vector<int> meetingOnline; for (int i = 0; i < n; ++i) { //Zliczanie spotkań if (tab[i] == '1') meetBiuroCount++; if (tab[i] == '2') { meetOnlineCount++; meetingOnline.push_back(i); } } int res = -1; for (int i1 = 0; i1 <= n-(2*t); ++i1) { if (i1 == n - (2 * t)) i1 = n + 1; int i2 = n-t; int caughBiuro = 0, caughtOnline = 0, free = 0; int lastOnline = -1; int ratio = -(meetBiuroCount - k); for (int j = 0; j < n; ++j) { //Zliczanie spotkań if (tab[j] == '2') lastOnline++; if (j < i1 || j >= i2+t) { if (tab[j] != '2') free++; if (tab[j] == '2') caughtOnline++; } else if (j >= i1+t && j < i2) { if (tab[j] != '3') caughBiuro++; if (tab[j] == '1') ratio++; if (lastOnline+ratio+1 >= 0 && (lastOnline+ratio+1 >= meetOnlineCount || meetingOnline[lastOnline+ratio+1] > j+t)) i2 = j+1; } else { if (tab[j] == '2') ratio--; } //cout << ratio << ' ' << j << ' ' << lastOnline << ' ' << meetingOnline[lastOnline] << ' ' << i2 << '\n'; } if (0 <= ratio) { free += min(ratio, caughtOnline); res = max(res, free); } //cout << ' '<< ratio << ' '<< free << endl; } return res; } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); //srand(time(NULL)); cin >> n >> k >> t; cin >> tab; cout << solve(); } |
English