#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(); } } |