思路
容易发现,如果 \(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;
}
标签:Beauty,int,题解,线段,交换,cin,CF1898D,ans
From: https://www.cnblogs.com/merlinkkk/p/18306131