From 3b4d2cf2d16cda6b923c44c1115373393c03e8f9 Mon Sep 17 00:00:00 2001 From: Segcolt <9hmbzr275@mozmail.com> Date: Tue, 12 Nov 2024 21:06:30 -0300 Subject: [PATCH] Add another simple problem. --- Paradigms/Elegant Permuted Sum.cpp | 177 +++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 Paradigms/Elegant Permuted Sum.cpp diff --git a/Paradigms/Elegant Permuted Sum.cpp b/Paradigms/Elegant Permuted Sum.cpp new file mode 100644 index 0000000..538c1b5 --- /dev/null +++ b/Paradigms/Elegant Permuted Sum.cpp @@ -0,0 +1,177 @@ +/* Problem URL: https://judge.beecrowd.com/en/problems/view/1055 */ + +#include + +using namespace std; + +#define V vector + +#define rmin(a, b) a = min(a, b) +#define rmax(a, b) a = max(a, b) + +#define rep(i, lim) for (size_t i = 0; i < (lim); i++) +#define nrep(i, s, lim) for (size_t i = s; i < (lim); i++) + +#define repv(i, v) for (auto &i : (v)) +#define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } +#define sortv(v) sort(v.begin(), v.end()) +#define all(v) (v).begin(), (v).end() + +using vi = vector; +using vvi = vector; +using vvvi = vector; +using vvvvi = vector; + +using ll = long long; + +using vl = vector; +using vvl = vector; +using vvvl = vector; +using vvvvl = vector; + +template +auto operator<<(ostream &os, const vector &vec)->ostream& { + os << vec[0]; + for (size_t i = 1; i < vec.size(); i++) { + os << ' ' << vec[i]; + } + os << '\n'; + return os; +} + +template +auto operator>>(istream &is, vector &vec)->istream& { + for (auto &i : vec) { + is >> i; + } + return is; +} + +template +auto operator<<(ostream &os, const vector> &vec)->ostream& { + for (auto &i : vec) { + os << i[0]; + for (size_t j = 1; j < i.size(); j++) { + os << ' ' << i[j]; + } + os << '\n'; + } + return os; +} + +template +auto operator>>(istream &is, vector> &vec)->istream& { + for (auto &i : vec) { + for (auto &j : i) { + is >> j; + } + } + return is; +} + +void push_min_back(list &ans, map &nums) +{ + auto itr = nums.begin(); + ans.push_back(itr->first); + itr->second--; + if (itr->second == 0) { + nums.erase(itr); + } +} + +void push_max_back(list &ans, map &nums) +{ + auto itr = prev(nums.end()); + ans.push_back(itr->first); + itr->second--; + if (itr->second == 0) { + nums.erase(itr); + } +} + +void push_min_front(list &ans, map &nums) +{ + auto itr = nums.begin(); + ans.push_front(itr->first); + itr->second--; + if (itr->second == 0) { + nums.erase(itr); + } +} + +void push_max_front(list &ans, map &nums) +{ + auto itr = prev(nums.end()); + ans.push_front(itr->first); + itr->second--; + if (itr->second == 0) { + nums.erase(itr); + } +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + int t; + cin >> t; + size_t i = 1; + while (t--) { + int n; + cin >> n; + + list ans; + map nums; + + while (n--) { + int num; + cin >> num; + nums[num]++; + } + + map tmp = nums; + + push_max_back(ans, nums); + + void (*push_to_list[])(list&, map&) { + push_min_back, + push_min_front, + push_max_back, + push_max_front + }; + + for (size_t i = 0; !nums.empty(); i = (i + 1) % 4) { + push_to_list[i](ans, nums); + } + + ll sum = 0; + auto prev = ans.begin(); + auto itr = next(prev); + while (itr != ans.end()) { + sum += abs(*prev - *itr); + prev++; + itr++; + } + + swap(tmp, nums); + + ans.clear(); + push_min_back(ans, nums); + + for (size_t i = 2; !nums.empty(); i = (i + 1) % 4) { + push_to_list[i](ans, nums); + } + + ll tmp_sum = 0; + prev = ans.begin(); + itr = next(prev); + while (itr != ans.end()) { + tmp_sum += abs(*prev - *itr); + prev++; + itr++; + } + + cout << "Case " << i++ << ": " << max(sum, tmp_sum) << '\n'; + } +}