#include #include #include #include #include using namespace std; int main() { unsigned long long cases; cin >> cases; while (cases--) { unsigned long long dim; cin >> dim; unsigned long long sl1[1000001] = { 0 }; unsigned long long sl2[1000001] = { 0 }; unsigned long long mins[2] = { 0 }; vector front; for (unsigned long long i = 0; i < dim; i++) { unsigned long long height; cin >> height; front.push_back(height); mins[0] += height; } vector side; for (unsigned long long i = 0; i < dim; i++) { unsigned long long height; cin >> height; side.push_back(height); mins[1] += height; } unsigned long long minimum = max(mins[0], mins[1]); unsigned long long maximum = 0; sort(front.begin(), front.end()); sort(side.begin(), side.end()); unsigned long long front_max = front[front.size() - 1]; unsigned long long old_counter = 0; for (int i = front.size() - 1; i >= 0;) { unsigned long long max = front[i]; unsigned long long counter = 0; while (i >= 0 && front[i] == max) { counter++; i--; } sl1[max] = counter + old_counter; old_counter = sl1[max]; } old_counter = 0; for (int i = side.size() - 1; i >= 0;) { unsigned long long max = side[i]; unsigned long long counter = 0; while (i >= 0 && side[i] == max) { counter++; i--; } sl2[max] = counter + old_counter; old_counter = sl2[max]; } unsigned long long s1_old = sl1[front_max]; unsigned long long s2_old = sl2[front_max]; for (unsigned long long i = front_max; i > 0; i--) { unsigned long long a = sl1[i] == 0 ? s1_old : sl1[i]; unsigned long long b = sl2[i] == 0 ? s2_old : sl2[i]; maximum += a * b; s1_old = a; s2_old = b; } cout << "Minimalni budova obsahuje " << minimum << " kostek, maximalni " << maximum << " kostek." << endl; } return 0; }