// Marcin Knapik // N^4 / bitset, due to some cache optimizations #pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define FOR(i, b) for (int i = 0; i < b; ++i) #define sz(s) (int)s.size() #define all(s) s.begin(), s.end() #define mp make_pair #define pb push_back const int N = 8003; int n, k, t; string events; int pref_zdalne[N]; int pref_stacjonarne[N]; void prep() { for (int i = 0; i < n; i++) { pref_zdalne[i] = (events[i] == '2') + (i == 0 ? 0 : pref_zdalne[i - 1]); pref_stacjonarne[i] = (events[i] == '1') + (i == 0 ? 0 : pref_stacjonarne[i - 1]); } } int zdalne(int start, int finish) { if (finish < start) { return 0; } return pref_zdalne[finish] - (start == 0 ? 0 : pref_zdalne[start - 1]); } int stacjonarne(int start, int finish) { if (finish < start) { return 0; } return pref_stacjonarne[finish] - (start == 0 ? 0 : pref_stacjonarne[start - 1]); } int ile_wszystkich_spotkan(int start, int finish) { return zdalne(start, finish) + stacjonarne(start, finish); } int goes_to_office_at_given_time(int start, int finish) { int ile_spotkan_w_biurze = ile_wszystkich_spotkan(start + t, finish - 1); int ile_omine_w_trasie = ile_wszystkich_spotkan(start, finish + t - 1) - ile_spotkan_w_biurze; int ile_omine_w_domu = stacjonarne(0, start - 1) + stacjonarne(finish + t, n - 1); // cout << ile_omine_w_domu << ' ' << ile_omine_w_trasie << endl; if (ile_omine_w_domu + ile_omine_w_trasie > k) { return -1; } int na_ilu_musze_byc_zdalnie = max((ile_wszystkich_spotkan(0, n - 1) - k) - ile_spotkan_w_biurze, 0); int ans = start + (n - (finish + t)) - na_ilu_musze_byc_zdalnie; // cout << start << ' ' << finish << ' ' << na_ilu_musze_byc_zdalnie << ' ' << ans << endl; return ans; } int goes_to_office() { int ans = -1; for (int i = 0; i < n; ++i) { for (int j = i + t; j <= n - t; ++j) { ans = max(ans, goes_to_office_at_given_time(i, j)); } } return ans; } int stays_at_home() { if (stacjonarne(0, n - 1) > k) { return -1; } int na_ilu_musze_byc = max(ile_wszystkich_spotkan(0, n - 1) - k, 0); return n - na_ilu_musze_byc; } void solve() { cin >> n >> k >> t; cin >> events; prep(); // cout << stays_at_home() << ' '; cout << max(stays_at_home(), goes_to_office()) << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); // int t = 1; // cin >> t; // FOR(test, t) // { solve(); // } return 0; }
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | // Marcin Knapik // N^4 / bitset, due to some cache optimizations #pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define FOR(i, b) for (int i = 0; i < b; ++i) #define sz(s) (int)s.size() #define all(s) s.begin(), s.end() #define mp make_pair #define pb push_back const int N = 8003; int n, k, t; string events; int pref_zdalne[N]; int pref_stacjonarne[N]; void prep() { for (int i = 0; i < n; i++) { pref_zdalne[i] = (events[i] == '2') + (i == 0 ? 0 : pref_zdalne[i - 1]); pref_stacjonarne[i] = (events[i] == '1') + (i == 0 ? 0 : pref_stacjonarne[i - 1]); } } int zdalne(int start, int finish) { if (finish < start) { return 0; } return pref_zdalne[finish] - (start == 0 ? 0 : pref_zdalne[start - 1]); } int stacjonarne(int start, int finish) { if (finish < start) { return 0; } return pref_stacjonarne[finish] - (start == 0 ? 0 : pref_stacjonarne[start - 1]); } int ile_wszystkich_spotkan(int start, int finish) { return zdalne(start, finish) + stacjonarne(start, finish); } int goes_to_office_at_given_time(int start, int finish) { int ile_spotkan_w_biurze = ile_wszystkich_spotkan(start + t, finish - 1); int ile_omine_w_trasie = ile_wszystkich_spotkan(start, finish + t - 1) - ile_spotkan_w_biurze; int ile_omine_w_domu = stacjonarne(0, start - 1) + stacjonarne(finish + t, n - 1); // cout << ile_omine_w_domu << ' ' << ile_omine_w_trasie << endl; if (ile_omine_w_domu + ile_omine_w_trasie > k) { return -1; } int na_ilu_musze_byc_zdalnie = max((ile_wszystkich_spotkan(0, n - 1) - k) - ile_spotkan_w_biurze, 0); int ans = start + (n - (finish + t)) - na_ilu_musze_byc_zdalnie; // cout << start << ' ' << finish << ' ' << na_ilu_musze_byc_zdalnie << ' ' << ans << endl; return ans; } int goes_to_office() { int ans = -1; for (int i = 0; i < n; ++i) { for (int j = i + t; j <= n - t; ++j) { ans = max(ans, goes_to_office_at_given_time(i, j)); } } return ans; } int stays_at_home() { if (stacjonarne(0, n - 1) > k) { return -1; } int na_ilu_musze_byc = max(ile_wszystkich_spotkan(0, n - 1) - k, 0); return n - na_ilu_musze_byc; } void solve() { cin >> n >> k >> t; cin >> events; prep(); // cout << stays_at_home() << ' '; cout << max(stays_at_home(), goes_to_office()) << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); // int t = 1; // cin >> t; // FOR(test, t) // { solve(); // } return 0; } |