目录

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;
}