开始补题QWQ
题意:
给两个数组AB,任选A中任意两个数交换,共进行K次,求结束后|a[i]-b[i]|
总和的最大值
易知:|ai-bi|=max(ai,bi)-min(ai,bi)
所以可以让c数组取较大值,d数组取较小值
c[i] = max(a[i], b[i]);
d[i] = min(a[i], b[i]);
此时ci>di,cj>dj
当di>cj
时
|ci-di|+|cj-dj|=ci+dj-ci-dj
交换di和dj
时
|ci-dj|+|cj-di|=ci-cj+di-dj
两者的差值为:2di-2cj
其中di=min(ai,bi) cj=max(aj,bj)
本次交换后的收益是2*min(ai,bi)-2*max(aj,bj)
当di<cj
时,两者差值为0
所以要找出前K个最大的2*min(ai,bi)-2*max(aj,bj)
若其小于0,则可以提前结束
数论的快乐就在于此QWQ
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int a[N], b[N], n, k;
int c[N], d[N];
long long ans;
bool cmp(int a, int b) {
return a > b;
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
for (int i = 1; i <= n; i++) {
ans += abs(a[i] - b[i]);
c[i] = max(a[i], b[i]);
d[i] = min(a[i], b[i]);
}
sort(c+1, c + 1 + n);
sort(d+1, d + 1 + n, cmp);
for (int i = 1; i <= min(n, k); i++) {
if (d[i] - c[i] < 0)
break;
ans += (long long)2 * (d[i] - c[i]);
}
cout << ans << endl;
return 0;
}