CF1898D Absolute Beauty 題解

merlinkkk發表於2024-07-16

思路

容易發現,如果 \(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;
}

相關文章