#pragma GCC optimize ("O3") #include <iostream> #include <vector> #include <algorithm> #include <utility> using namespace std; int max_sum(vector<int> arr) { int max = 0; int sum = 0; for (int i = 0; i < arr.size(); i++) { sum += arr[i]; if (sum > max) max = sum; if (sum < 0) { sum = 0; } } return max; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, req_a, req_b, obraz, ile_a = 0, ile_b = 0; vector<int> wystawa; string wystawcy; vector<pair<int, int>> obrazy; cin >> n >> req_a; req_b = n - req_a; for (int i = 0; i < n; i++) { cin >> obraz; obrazy.push_back(pair<int, int>(obraz, 0)); } for (int i = 0; i < n; i++) { cin >> obraz; obrazy[i].second = obraz; } for (auto week : obrazy) { if (week.first > week.second) { wystawa.push_back(week.second); wystawcy += 'B'; ile_b++; } else if (week.first < week.second) { wystawa.push_back(week.first); wystawcy += 'A'; ile_a++; } else { if (req_a - ile_a >= req_b - ile_b) { wystawa.push_back(week.second); wystawcy += 'B'; ile_b++; } else { wystawa.push_back(week.first); wystawcy += 'A'; ile_a++; } } } vector<pair<int, pair<int, int>>> do_zmiany; char wrong; if (ile_a > req_a) wrong = 'A'; else if (ile_b > req_b) wrong = 'B'; else wrong = 'C'; for (int i = 0; i < n; i++) { if (wystawcy[i] == wrong) do_zmiany.push_back(pair<int, pair<int, int>>(i, obrazy[i])); } if (wrong == 'A') sort(do_zmiany.begin(), do_zmiany.end(), [] (pair<int, pair<int, int>> a, pair<int, pair<int, int>> b) { if (a.second.second - a.second.first == b.second.second - b.second.first) return a.second.first < b.second.first; else return a.second.second - a.second.first < b.second.second - b.second.first; }); else if (wrong == 'B') sort(do_zmiany.begin(), do_zmiany.end(), [] (pair<int, pair<int, int>> a, pair<int, pair<int, int>> b) { if (a.second.first - a.second.second == b.second.first - b.second.second) return a.second.first < b.second.first; else return a.second.first - a.second.second < b.second.first - b.second.second; }); int it; vector<int> wartosci; for (int i = 0; i < (wrong == 'A' ? ile_a - req_a : ile_b - req_b); i++) { it = do_zmiany[i].first; // swap(obrazy[it].first, obrazy[it].second); if (wystawcy[it] == 'A') wystawcy[it] = 'B'; else wystawcy[it] = 'A'; } for (int i = 0; i < n; i++) { if (wystawcy[i] == 'A') wartosci.push_back(obrazy[i].first); else wartosci.push_back(obrazy[i].second); } cout << max_sum(wartosci) << '\n'; cout << wystawcy; 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 | #pragma GCC optimize ("O3") #include <iostream> #include <vector> #include <algorithm> #include <utility> using namespace std; int max_sum(vector<int> arr) { int max = 0; int sum = 0; for (int i = 0; i < arr.size(); i++) { sum += arr[i]; if (sum > max) max = sum; if (sum < 0) { sum = 0; } } return max; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, req_a, req_b, obraz, ile_a = 0, ile_b = 0; vector<int> wystawa; string wystawcy; vector<pair<int, int>> obrazy; cin >> n >> req_a; req_b = n - req_a; for (int i = 0; i < n; i++) { cin >> obraz; obrazy.push_back(pair<int, int>(obraz, 0)); } for (int i = 0; i < n; i++) { cin >> obraz; obrazy[i].second = obraz; } for (auto week : obrazy) { if (week.first > week.second) { wystawa.push_back(week.second); wystawcy += 'B'; ile_b++; } else if (week.first < week.second) { wystawa.push_back(week.first); wystawcy += 'A'; ile_a++; } else { if (req_a - ile_a >= req_b - ile_b) { wystawa.push_back(week.second); wystawcy += 'B'; ile_b++; } else { wystawa.push_back(week.first); wystawcy += 'A'; ile_a++; } } } vector<pair<int, pair<int, int>>> do_zmiany; char wrong; if (ile_a > req_a) wrong = 'A'; else if (ile_b > req_b) wrong = 'B'; else wrong = 'C'; for (int i = 0; i < n; i++) { if (wystawcy[i] == wrong) do_zmiany.push_back(pair<int, pair<int, int>>(i, obrazy[i])); } if (wrong == 'A') sort(do_zmiany.begin(), do_zmiany.end(), [] (pair<int, pair<int, int>> a, pair<int, pair<int, int>> b) { if (a.second.second - a.second.first == b.second.second - b.second.first) return a.second.first < b.second.first; else return a.second.second - a.second.first < b.second.second - b.second.first; }); else if (wrong == 'B') sort(do_zmiany.begin(), do_zmiany.end(), [] (pair<int, pair<int, int>> a, pair<int, pair<int, int>> b) { if (a.second.first - a.second.second == b.second.first - b.second.second) return a.second.first < b.second.first; else return a.second.first - a.second.second < b.second.first - b.second.second; }); int it; vector<int> wartosci; for (int i = 0; i < (wrong == 'A' ? ile_a - req_a : ile_b - req_b); i++) { it = do_zmiany[i].first; // swap(obrazy[it].first, obrazy[it].second); if (wystawcy[it] == 'A') wystawcy[it] = 'B'; else wystawcy[it] = 'A'; } for (int i = 0; i < n; i++) { if (wystawcy[i] == 'A') wartosci.push_back(obrazy[i].first); else wartosci.push_back(obrazy[i].second); } cout << max_sum(wartosci) << '\n'; cout << wystawcy; return 0; } |