// Szymon Rusiecki (09.12.2021)
#include <bits/stdc++.h>
const size_t mask_size = 1048576;
long long binom(long long n, long long k) {
long long output = 1;
for (int i = 1; i <= k; ++i) {
output *= n - k + i;
output /= i;
}
return output;
}
long long Kadane(long long *A, long long *B, std::bitset<mask_size> &bit_mask, int len) {
long long output = LONG_LONG_MIN;
long long maxi_value = 0;
for (int i = 0; i < len; ++i) {
if (bit_mask[i + 2] == 0) maxi_value += B[i];
else maxi_value += A[i];
if (output < maxi_value)
output = maxi_value;
if (maxi_value < 0)
maxi_value = 0;
}
return output;
}
void add(std::bitset<mask_size> &bit_mask, int *index, int n, int k, int it) {
if (bit_mask[index[it] + 1] == 0) {
bit_mask[index[it]] = 0;
++index[it];
bit_mask[index[it]] = 1;
return;
}
else {
add(bit_mask, index, n, k, it - 1);
bit_mask[index[it]] = 0;
index[it] = index[it - 1] + 1;
bit_mask[index[it]] = 1;
return;
}
}
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
long long n, k;
std::cin >> n >> k;
auto *A = new long long [n];
auto *B = new long long [n];
for (int i = 0; i < n; ++i)
std::cin >> A[i];
for (int i = 0; i < n; ++i)
std::cin >> B[i];
std::bitset<mask_size> bit_mask;
std::bitset<mask_size> output;
for (int i = 0; i < mask_size; ++i)
bit_mask[i] = 0;
for (int i = 2; i < k + 2; ++i)
bit_mask[i] = 1;
bit_mask[n + 2] = 1;
bit_mask[0] = 1;
int *index = new int [k + 1];
for (int i = 1; i <= k; ++i)
index[i] = i + 1;
index[0] = 0;
long long loop_size = binom(n, k);
long long score = LONG_LONG_MAX;
for (int i = 0; i < loop_size; ++i) {
long long temp = Kadane(A, B, bit_mask, n);
if (temp < score) {
score = std::max(temp, 0LL);
output = bit_mask;
}
add(bit_mask, index, n, k, k);
}
std::cout << score << '\n';
for (int i = 2; i < n + 2; ++i)
(output[i] == 1) ? std::cout << 'A' : std::cout << 'B';
delete [] A;
delete [] B;
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 | // Szymon Rusiecki (09.12.2021) #include <bits/stdc++.h> const size_t mask_size = 1048576; long long binom(long long n, long long k) { long long output = 1; for (int i = 1; i <= k; ++i) { output *= n - k + i; output /= i; } return output; } long long Kadane(long long *A, long long *B, std::bitset<mask_size> &bit_mask, int len) { long long output = LONG_LONG_MIN; long long maxi_value = 0; for (int i = 0; i < len; ++i) { if (bit_mask[i + 2] == 0) maxi_value += B[i]; else maxi_value += A[i]; if (output < maxi_value) output = maxi_value; if (maxi_value < 0) maxi_value = 0; } return output; } void add(std::bitset<mask_size> &bit_mask, int *index, int n, int k, int it) { if (bit_mask[index[it] + 1] == 0) { bit_mask[index[it]] = 0; ++index[it]; bit_mask[index[it]] = 1; return; } else { add(bit_mask, index, n, k, it - 1); bit_mask[index[it]] = 0; index[it] = index[it - 1] + 1; bit_mask[index[it]] = 1; return; } } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); long long n, k; std::cin >> n >> k; auto *A = new long long [n]; auto *B = new long long [n]; for (int i = 0; i < n; ++i) std::cin >> A[i]; for (int i = 0; i < n; ++i) std::cin >> B[i]; std::bitset<mask_size> bit_mask; std::bitset<mask_size> output; for (int i = 0; i < mask_size; ++i) bit_mask[i] = 0; for (int i = 2; i < k + 2; ++i) bit_mask[i] = 1; bit_mask[n + 2] = 1; bit_mask[0] = 1; int *index = new int [k + 1]; for (int i = 1; i <= k; ++i) index[i] = i + 1; index[0] = 0; long long loop_size = binom(n, k); long long score = LONG_LONG_MAX; for (int i = 0; i < loop_size; ++i) { long long temp = Kadane(A, B, bit_mask, n); if (temp < score) { score = std::max(temp, 0LL); output = bit_mask; } add(bit_mask, index, n, k, k); } std::cout << score << '\n'; for (int i = 2; i < n + 2; ++i) (output[i] == 1) ? std::cout << 'A' : std::cout << 'B'; delete [] A; delete [] B; return 0; } |
English