思路
容易發現,如果 \(a_i>b_i\) 則將 \(a_i\) 和 \(b_i\) 交換。
在數軸上標出要交換的四個數的位置若線段 \(a_ib_i\) 和 線段 \(a_jb_j\) 互不相交,此時交換比兩條線段處於其他位置時更優。
具體證明這裡就不再贅述,其他題解講的已經很清楚了。
所以只需交換最大的 \(a_i\) 和最小的 \(b_j\) 即可。
程式碼
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[200010], b[200010];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin>>T;
while(T--) {
int n;
cin>>n;
int mx=-1e9, mn=1e9;
int ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
if(a[i]>b[i]) swap(a[i],b[i]);
}
for(int i=1;i<=n;i++) {
ans+=abs(b[i]-a[i]);
mx=max(mx,a[i]); mn=min(mn,b[i]);
}
if(mx>mn) ans+=2*(mx-mn);
cout<<ans<<"\n";
}
return 0;
}