#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
template<class T> using ordered_set =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update> ;
#define debug(x) cout << "[" << #x << " " << x << "] ";
#define ar array
#define ll long long
#define ld long double
#define sz(x) ((int)x.size())
#define all(a) (a).begin(), (a).end()
typedef vector<int> vi;
typedef pair<int,int> pi;
const int MAX_N = 1e5 + 5;
const ll MOD = 1e9 + 7;
const ll INF = 1e9;
const ld EPS = 1e-9;
void solve() {
int n, k, t;
cin >> n >> k >> t;
string events;
cin >> events;
int counts[4] = {0, 0, 0, 0};
vector<ar<int,4>> prefsum = vector<ar<int,4>>(n+1, {0, 0, 0, 0});
for (int i = 0; i < n; i++) {
counts[events[i] - '0']++;
for (int j = 0; j < 4; j++) {
prefsum[i+1][j] = counts[j];
}
}
if (counts[1] <= k){
cout << counts[3] + min(counts[1] + counts[2], k) << "\n";
return;
}
int maxim = -1;
int overall_meetings = counts[1] + counts[2];
for (int beg = t+1; beg <= n-t; beg++) {
for (int end = beg; end <= n-t; end++) {
int office_meetings = prefsum[end][1] - prefsum[beg-1][1];
int online_meetings = prefsum[end][2] - prefsum[beg-1][2];
int meetings_in_range = office_meetings + online_meetings;
int meetings_left = overall_meetings - meetings_in_range;
if (meetings_left <= k) {
maxim = max(maxim, n - (end-beg+1+2*t));
}
else{
int left_online_mettings = counts[2] - (prefsum[end+t][2] - prefsum[beg-t-1][2]);
int todo = meetings_left - k;
if (todo <= left_online_mettings) {
maxim = max(maxim, n - (end-beg+1+2*t) - todo);
}
}
}
}
cout << maxim << "\n";
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int tc = 1;
for (int t = 1; t <= tc; t++) {
// cout << "Case #" << t << ": ";
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 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; template<class T> using ordered_set =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update> ; #define debug(x) cout << "[" << #x << " " << x << "] "; #define ar array #define ll long long #define ld long double #define sz(x) ((int)x.size()) #define all(a) (a).begin(), (a).end() typedef vector<int> vi; typedef pair<int,int> pi; const int MAX_N = 1e5 + 5; const ll MOD = 1e9 + 7; const ll INF = 1e9; const ld EPS = 1e-9; void solve() { int n, k, t; cin >> n >> k >> t; string events; cin >> events; int counts[4] = {0, 0, 0, 0}; vector<ar<int,4>> prefsum = vector<ar<int,4>>(n+1, {0, 0, 0, 0}); for (int i = 0; i < n; i++) { counts[events[i] - '0']++; for (int j = 0; j < 4; j++) { prefsum[i+1][j] = counts[j]; } } if (counts[1] <= k){ cout << counts[3] + min(counts[1] + counts[2], k) << "\n"; return; } int maxim = -1; int overall_meetings = counts[1] + counts[2]; for (int beg = t+1; beg <= n-t; beg++) { for (int end = beg; end <= n-t; end++) { int office_meetings = prefsum[end][1] - prefsum[beg-1][1]; int online_meetings = prefsum[end][2] - prefsum[beg-1][2]; int meetings_in_range = office_meetings + online_meetings; int meetings_left = overall_meetings - meetings_in_range; if (meetings_left <= k) { maxim = max(maxim, n - (end-beg+1+2*t)); } else{ int left_online_mettings = counts[2] - (prefsum[end+t][2] - prefsum[beg-t-1][2]); int todo = meetings_left - k; if (todo <= left_online_mettings) { maxim = max(maxim, n - (end-beg+1+2*t) - todo); } } } } cout << maxim << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tc = 1; for (int t = 1; t <= tc; t++) { // cout << "Case #" << t << ": "; solve(); } } |
English