数学专题训练5 贪心

1. G-Game of Swapping Numbers

给定序列 A , B A,B A,B​,需要交换恰好 k k k​ 次 A A A​ 中两个不同的数,使得 A , B A,B A,B​ 每个位置的绝对差值和最大。 N ≤ 100000 N \le 100000 N100000

一道有点像的题目

[D. Swapping Problem](Problem - F - Codeforces)

在这里插入图片描述

  • 思路:直接看题解:
    在这里插入图片描述
    在这里插入图片描述
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;

int n;
const int N = 200010;
ll a[N], b[N];
int main()
{
    scanf("%d", &n);
    map<ll, ll> segX, segY;
    for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%lld", &b[i]);
    for(int i = 1; i <= n; i++){
        if(a[i] <= b[i]){
            if(!segX.count(a[i])) segX[a[i]] = b[i];
            else segX[a[i]] = max(segX[a[i]], b[i]);
        }
        else{
            if(!segY.count(b[i])) segY[b[i]] = a[i];
            else segY[b[i]] = max(segY[b[i]], a[i]);
        }
    }
    ll mx = -1e18;
    for(auto & p : segX){
        mx = max(mx, p.y);
        p.y = mx;
    }
    mx = -1e18;
    for(auto & p : segY){
        mx = max(mx, p.y);
        p.y = mx;
    }
    ll res = 0, ans = 0;
    //当 a[i] <= b[i] 的时候,我们只关心 b[j] <= a[i] 的情况,因为另外一种情况可以在 a[i] > b[i] 的时候考虑到.
    for(int i = 1; i <= n; i++){
        if(a[i] <= b[i]){
            //因为it.y 保存的是左端点从 -inf ~ it.x 的,右端点的最大值.
            auto it = segY.upper_bound(a[i]);
            if(it == segY.begin()) continue;

            it--;
            res = max(res, 2LL * (min(it->y, b[i]) - a[i]));
        }
        else{
            auto it = segX.upper_bound(b[i]);
            if(it == segX.begin()) continue;

            it--;
            res = max(res, 2LL * (min(it->y, a[i]) - b[i]));
        }
    }
    for(int i = 1; i <= n; i++) ans += abs(a[i] - b[i]);
    cout << ans - res << endl;
}

2. K-Knowledge Test about Match

Display Substring - HDU 6988 - Virtual Judge (vjudge.net)

后缀自动机

3. Another String - HDU 7015 - Virtual Judge (vjudge.net)

双指针弄一弄

4. Median - HDU 7029 - Virtual Judge (vjudge.net)

贪心

5. Decomposition - HDU 7028 - Virtual Judge (vjudge.net)

奇妙构造

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值