目录
Description
有两个数组,必须在 \(A\) 数组中交换 \(k\) 次,求 \(\sum|a[i]-b[i]|\) 的最大值
State
\(1<=n<=5*10^5\)
\(10^{-8}<=a[i], b[i]<=10^{-8}\)
\(0<=k<=10^8\)
Input
3 2
1 2 3
3 2 1
Output
4
Solution
令 \(A_i\) 为 \(a_i,\ b_i\) 较小的那个数, \(B_i\) 为较大的那个
按 \(A_i\) 升序排列,很容易发现,只有当 \(A_i<=B_i<A_j<=B_j\) 的时候,交换 \((i,j)\) 才可以产生贡献,贡献为 \(2*(A_j-B_i)\) ,充分利用 \(k\) ,所以 \(A\) 降序排列,\(B\) 升序排列;
本来以为是一个动态的题目,结果到这里就可以了
Code
const int N = 5e5 + 5;
int n, m, _, k;
int a[N];
int b[N];
signed main()
{
//IOS;
while(~ sdd(n, k)){
rep(i, 1, n) sd(a[i]);
rep(i, 1, n) sd(b[i]);
priority_queue<int> A;
priority_queue<int, vector<int>, greater<int>> B;
ll ans = 0;
rep(i, 1, n){
B.push(max(a[i], b[i]));
A.push(min(a[i], b[i]));
ans += abs(a[i] - b[i]);
}
while(k --> 0){
int maxx = 0, minn = 0;
if(! A.empty()){
maxx = A.top();
A.pop();
}
if(! B.empty()){
minn = B.top();
B.pop();
}
if(maxx > minn){
ans += 2 * (maxx - minn);
}
else break;
}
pll(ans);
}
//PAUSE;
return 0;
}