#include <bits/stdc++.h>
#define rep(a,b,c) for(auto a = (b); a != (c); a++)
#define repD(a,b,c) for(auto a = (b); a != (c); a--)
#define repIn(a, b) for(auto& a : (b))
#define repIn2(a, b, c) for(auto& [a, b] : (c))
constexpr bool dbg = 0;
#define DEBUG if constexpr(dbg)
#define DC DEBUG std::cerr
#define eol std::endl
#define ll long long
#define pb push_back
using namespace std;
#define OFFICE 0
#define REMOTE 1
#define FREE 2
int main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n, k, t;
cin >> n >> k >> t;
vector<int> type(n);
vector<array<int, 3>> prefSum(n, {0, 0, 0});
char c;
rep(i, 0, n) {
cin >> c, type[i] = c - '1';
if(i != 0) rep(j, 0, 3) prefSum[i][j] = prefSum[i - 1][j];
prefSum[i][type[i]]++;
}
int ans = -1;
rep(i, t, n) rep(j, i, max(i, n - t)) {
int skippedOffice = (i == 0 ? 0 : prefSum[i - 1][OFFICE]) + prefSum[n - 1][OFFICE] - prefSum[j][OFFICE];
int skippedRemote = (i == 0 ? 0 : prefSum[i - 1][REMOTE]) - (i == t ? 0 : prefSum[i - t - 1][REMOTE]) + prefSum[j + t][REMOTE] - prefSum[j][REMOTE];
DC << "Going to work from " << i << " to " << j;
if(skippedOffice + skippedRemote > k) DC << " skips too much" << eol;
if(skippedOffice + skippedRemote > k) continue;
int skipableRemote = (i == t ? 0 : prefSum[i - t - 1][REMOTE]) + prefSum[n - 1][REMOTE] - prefSum[j + t][REMOTE];
int skippedRemote2 = min(skipableRemote, k - skippedRemote - skippedOffice);
int myAns = n - (j - i + 1 + 2 * t) - skipableRemote + skippedRemote2;
DC << " gives us " << myAns << eol;
DC << " ( skipped office " << skippedOffice << "; skipped remote " << skippedRemote << " + " << skippedRemote2 << "; remote at home " << skipableRemote << " - " << skippedRemote2 << " )" << eol;
ans = max(ans, myAns);
}
int skippedOffice = prefSum[n - 1][OFFICE];
int skippedRemote = 0;
DC << "Not going to work";
if(skippedOffice + skippedRemote > k) DC << " skips too much" << eol;
if(skippedOffice + skippedRemote <= k) {
int skipableRemote = prefSum[n - 1][REMOTE];
int skippedRemote2 = min(skipableRemote, k - skippedRemote - skippedOffice);
int myAns = n - skipableRemote + skippedRemote2;
DC << " gives us " << myAns << eol;
DC << " ( skipped office " << skippedOffice << "; skipped remote " << skippedRemote << " + " << skippedRemote2 << "; remote at home " << skipableRemote << " - " << skippedRemote2 << " )" << eol;
ans = max(ans, myAns);
}
cout << ans << '\n';
}
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 | #include <bits/stdc++.h> #define rep(a,b,c) for(auto a = (b); a != (c); a++) #define repD(a,b,c) for(auto a = (b); a != (c); a--) #define repIn(a, b) for(auto& a : (b)) #define repIn2(a, b, c) for(auto& [a, b] : (c)) constexpr bool dbg = 0; #define DEBUG if constexpr(dbg) #define DC DEBUG std::cerr #define eol std::endl #define ll long long #define pb push_back using namespace std; #define OFFICE 0 #define REMOTE 1 #define FREE 2 int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, k, t; cin >> n >> k >> t; vector<int> type(n); vector<array<int, 3>> prefSum(n, {0, 0, 0}); char c; rep(i, 0, n) { cin >> c, type[i] = c - '1'; if(i != 0) rep(j, 0, 3) prefSum[i][j] = prefSum[i - 1][j]; prefSum[i][type[i]]++; } int ans = -1; rep(i, t, n) rep(j, i, max(i, n - t)) { int skippedOffice = (i == 0 ? 0 : prefSum[i - 1][OFFICE]) + prefSum[n - 1][OFFICE] - prefSum[j][OFFICE]; int skippedRemote = (i == 0 ? 0 : prefSum[i - 1][REMOTE]) - (i == t ? 0 : prefSum[i - t - 1][REMOTE]) + prefSum[j + t][REMOTE] - prefSum[j][REMOTE]; DC << "Going to work from " << i << " to " << j; if(skippedOffice + skippedRemote > k) DC << " skips too much" << eol; if(skippedOffice + skippedRemote > k) continue; int skipableRemote = (i == t ? 0 : prefSum[i - t - 1][REMOTE]) + prefSum[n - 1][REMOTE] - prefSum[j + t][REMOTE]; int skippedRemote2 = min(skipableRemote, k - skippedRemote - skippedOffice); int myAns = n - (j - i + 1 + 2 * t) - skipableRemote + skippedRemote2; DC << " gives us " << myAns << eol; DC << " ( skipped office " << skippedOffice << "; skipped remote " << skippedRemote << " + " << skippedRemote2 << "; remote at home " << skipableRemote << " - " << skippedRemote2 << " )" << eol; ans = max(ans, myAns); } int skippedOffice = prefSum[n - 1][OFFICE]; int skippedRemote = 0; DC << "Not going to work"; if(skippedOffice + skippedRemote > k) DC << " skips too much" << eol; if(skippedOffice + skippedRemote <= k) { int skipableRemote = prefSum[n - 1][REMOTE]; int skippedRemote2 = min(skipableRemote, k - skippedRemote - skippedOffice); int myAns = n - skipableRemote + skippedRemote2; DC << " gives us " << myAns << eol; DC << " ( skipped office " << skippedOffice << "; skipped remote " << skippedRemote << " + " << skippedRemote2 << "; remote at home " << skipableRemote << " - " << skippedRemote2 << " )" << eol; ans = max(ans, myAns); } cout << ans << '\n'; } |
English