图形思维

发布时间 2023-11-21 15:33:56作者: spiderflower

题目传送门:Problem - D - Codeforces

题目大意:给定长度为n的数组a和b,定义b数组的价值为\sum _{i = 1}^{n}|a_{i} - b_{i}|,现可以交换一次b数组中的任意两个元素,求b数组的价值最大值

思路:绝对值问题可以放在数轴上去解决。绝对值即为区间长度。

 

 

ps:摘抄大佬

每个对应的 |ai - bi| 就是一条线段,我们只能交换一次,对于每每两条的线段一共就有如上图四种的情况,所以我们要增大我们的贡献值就只有第二种情况可以满足,通俗的说就是找两条相差最远的两条线段他们产生的贡献值就是 2*(l2 - r1) ,代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6 + 110, mod = 1e9 + 7;
int ans = 0;
int a[N];
int b[N];
void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];

    for (int i = 1; i <= n; i++) cin >> b[i];

    int mi_r = 1e9;
    int ma_l = 0;
    ans = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i] > b[i]) swap(a[i], b[i]);
        mi_r = min(mi_r, b[i]);

        ma_l = max(ma_l, a[i]);
        ans += abs(a[i] - b[i]);
    }
    if (mi_r < ma_l) {
        cout << ans + 2 * (ma_l - mi_r)<<"\n";
    }else{
        cout<<ans<<'\n';
    }

}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}