Petya 有一个由 n n n 个整数组成的数组 a i a_i ai 。他的弟弟 Vasya 很羡慕,决定自己也做一个 n n n 个整数的数组。
为此,他找到了 m m m 个整数 b i ( m ≥ n ) b_i ( m≥n ) bi(m≥n),现在他想从中选择一些 n n n 个整数并按一定的顺序排列,得到一个长度为 n n n 的数组 c i c_i ci 。
为了避免与哥哥的数组相似,瓦夏希望自己的数组与彼佳的数组尽可能不同。具体来说,他希望总差值 D = ∑ n i = 1 ∣ a i − c i ∣ D=∑ni=1|ai−ci| D=∑ni=1∣ai−ci∣ 越大越好。
帮助瓦夏找出他能得到的最大差值 D D D 。
输入
每个测试由多个测试用例组成。第一行包含一个整数 t ( 1 ≤ t ≤ 100 ) t ( 1≤t≤100 ) t(1≤t≤100) - 测试用例数。随后是测试用例的描述。
每个测试用例的第一行包含两个整数 n n n 和 m ( 1 ≤ n ≤ m ≤ 2 ⋅ 1 0 5 ) m ( 1≤n≤m≤2⋅10^5 ) m(1≤n≤m≤2⋅105)。
每个测试用例的第二行包含 n n n 个整数 a i ( 1 ≤ a i ≤ 1 0 9 ) a_i ( 1≤a_i≤10^9 ) ai(1≤ai≤109)。
每个测试用例的第三行包含 m m m 个整数 b i ( 1 ≤ b i ≤ 1 0 9 ) b_i ( 1≤b_i≤10^9 ) bi(1≤bi≤109)。
保证在一个测试中,所有测试用例中 m m m 的总和不超过 2 ⋅ 1 0 5 2⋅10^5 2⋅105 。
输出
对于每个测试用例,输出一个整数 - 可获得的最大总差值 D D D 。
特殊的贪心方式。
首先对于一个升序序列,距离 a i a_i ai 差值最大的一个元素是 a n − i + 1 a_{n - i + 1} an−i+1,也就是往两边取。
那么对于当前两个数组也可以用类似的方法做,在此题中,就是距离 a i a_i ai 差值最大的元素有 b n − i + 1 , b m − i + 1 b_{n - i + 1},b_{m - i +1} bn−i+1,bm−i+1。
CODE:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;void solve(){int n,m;cin >> n >> m;vector<int>a(n+1);vector<int>b(m+1);for(int i = 1;i <= n;i++)cin >> a[i];for(int j = 1;j <= m;j++)cin >> b[j];sort(a.begin() + 1,a.end());sort(b.begin() + 1,b.end());long long res = 0;for(int i = 1;i <= n;i++){res += max(abs(a[i] - b[n-i+1]),abs(a[i] - b[m-i+1]));}cout << res << endl;
}
int main(){int T;cin >> T;while(T--){solve();}return 0;
}