#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2") #define LL long long #define int long long int32_t main() { int n,k,t; cin>>n>>k>>t; vector<char> tab(n); vector<int> prefix1(n, -1); vector<int> prefix2(n, -1); vector<int> prefix3(n, -1); int s3=0; int s1 = 0; int s2 = 0; for(int i=0;i<n;i++){ cin>>tab[i]; tab[i] -= '0'; if(tab[i] == 1){ s1++; } if(tab[i] == 2){ s2++; } if(tab[i] == 3){ s3++; } } prefix1[0] = 0; prefix2[0] = 0; prefix3[0] = 0; for(int i=1;i<n;i++){ prefix1[i] = prefix1[i-1] + (tab[i-1] == 1? 1:0); prefix2[i] = prefix2[i-1] + (tab[i-1] == 2? 1:0); prefix3[i] = prefix3[i-1] + (tab[i-1] == 3? 1:0); } int m = -1; if(s1 <= k){ cout<<n-max(0ll, s1+s2-k)<<endl; return 0; } for(int i=0;i<n-2*t+1;i++){ for(int j=i+t;j<n-t+1;j++){ int stracone = 0; stracone += prefix1[i+t]; stracone += s1 - prefix1[j]; stracone += prefix2[i+t] - prefix2[i]; stracone += (j+t>=n?s2:prefix2[j+t]) - prefix2[j]; if(stracone > k) continue; int pozostalo = k - stracone; int wolne = 0; int zdalne = 0; wolne += prefix3[i]; wolne += s3 - (j+t>=n?s3:prefix3[j+t]); wolne += prefix1[i]; wolne += s1 - (j+t>=n?s1:prefix1[j+t]); zdalne += prefix2[i]; zdalne += s2 - (j+t>=n?s2:prefix2[j+t]); int wyn = wolne + min(pozostalo, zdalne); m = max(m, wyn); } } cout<<m<<endl; 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 | #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2") #define LL long long #define int long long int32_t main() { int n,k,t; cin>>n>>k>>t; vector<char> tab(n); vector<int> prefix1(n, -1); vector<int> prefix2(n, -1); vector<int> prefix3(n, -1); int s3=0; int s1 = 0; int s2 = 0; for(int i=0;i<n;i++){ cin>>tab[i]; tab[i] -= '0'; if(tab[i] == 1){ s1++; } if(tab[i] == 2){ s2++; } if(tab[i] == 3){ s3++; } } prefix1[0] = 0; prefix2[0] = 0; prefix3[0] = 0; for(int i=1;i<n;i++){ prefix1[i] = prefix1[i-1] + (tab[i-1] == 1? 1:0); prefix2[i] = prefix2[i-1] + (tab[i-1] == 2? 1:0); prefix3[i] = prefix3[i-1] + (tab[i-1] == 3? 1:0); } int m = -1; if(s1 <= k){ cout<<n-max(0ll, s1+s2-k)<<endl; return 0; } for(int i=0;i<n-2*t+1;i++){ for(int j=i+t;j<n-t+1;j++){ int stracone = 0; stracone += prefix1[i+t]; stracone += s1 - prefix1[j]; stracone += prefix2[i+t] - prefix2[i]; stracone += (j+t>=n?s2:prefix2[j+t]) - prefix2[j]; if(stracone > k) continue; int pozostalo = k - stracone; int wolne = 0; int zdalne = 0; wolne += prefix3[i]; wolne += s3 - (j+t>=n?s3:prefix3[j+t]); wolne += prefix1[i]; wolne += s1 - (j+t>=n?s1:prefix1[j+t]); zdalne += prefix2[i]; zdalne += s2 - (j+t>=n?s2:prefix2[j+t]); int wyn = wolne + min(pozostalo, zdalne); m = max(m, wyn); } } cout<<m<<endl; return 0; } |