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;
}