Beecrowd-solutions/Paradigms/Elegant Permuted Sum.cpp

178 lines
3.6 KiB
C++

/* Problem URL: https://judge.beecrowd.com/en/problems/view/1055 */
#include <bits/stdc++.h>
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<int>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using vvvvi = vector<vvvi>;
using ll = long long;
using vl = vector<ll>;
using vvl = vector<vl>;
using vvvl = vector<vvl>;
using vvvvl = vector<vvvl>;
template<class v>
auto operator<<(ostream &os, const vector<v> &vec)->ostream& {
os << vec[0];
for (size_t i = 1; i < vec.size(); i++) {
os << ' ' << vec[i];
}
os << '\n';
return os;
}
template<class v>
auto operator>>(istream &is, vector<v> &vec)->istream& {
for (auto &i : vec) {
is >> i;
}
return is;
}
template<class v>
auto operator<<(ostream &os, const vector<vector<v>> &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<class v>
auto operator>>(istream &is, vector<vector<v>> &vec)->istream& {
for (auto &i : vec) {
for (auto &j : i) {
is >> j;
}
}
return is;
}
void push_min_back(list<int> &ans, map<int, int> &nums)
{
auto itr = nums.begin();
ans.push_back(itr->first);
itr->second--;
if (itr->second == 0) {
nums.erase(itr);
}
}
void push_max_back(list<int> &ans, map<int, int> &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<int> &ans, map<int, int> &nums)
{
auto itr = nums.begin();
ans.push_front(itr->first);
itr->second--;
if (itr->second == 0) {
nums.erase(itr);
}
}
void push_max_front(list<int> &ans, map<int, int> &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<int> ans;
map<int, int> nums;
while (n--) {
int num;
cin >> num;
nums[num]++;
}
map<int, int> tmp = nums;
push_max_back(ans, nums);
void (*push_to_list[])(list<int>&, map<int, int>&) {
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';
}
}