源代码:
https://github.com/abmcar/ACM/tree/master/OpenjudgeNow/Codeforces/Codeforces%20Round%20%23768%20(Div.%202)

A. Min Max Swap

在这里插入图片描述
题目大意:
在这里插入图片描述
思路:
我们知道在两数之和相等的情况下,二者的差越大,乘积越小
不难得出,该题的答案为:最小的最大值*最大的最大值,我们把同一位置上比较小的一个数字放到数组A里,比较大的一个放到数组B里
代码:

void work()
{
    cin >> n;
    vector<int> a(n), b(n), c;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n; i++)
        cin >> b[i];
    int max1, max2;
    max1 = max2 = 0;
    for (int i = 0; i < n; i++)
    {
        if (a[i] < b[i])
            swap(a[i], b[i]);
        max1 = max(max1, a[i]);
        max2 = max(max2, b[i]);
    }
    cout << max1 * max2 << endl;
    return;
}

B. Fun with Even Subarrays

在这里插入图片描述
题目大意:
在这里插入图片描述
思路:
我们知道到最终数组里的所有数都等于a[n],因此,我们倒着遍历数组a,当我们发现a[i] != a[n]时,寻找一个尽可能长的区间使得该区间的末尾为a[i],并将这个区间里的所有数替换为a[n]
代码:

void work()
{
    cin >> n;
    vector<int> nums(n+1);
    for (int i = 1; i <= n; i++)
        cin >> nums[i];
    int cnt = 0;
    for (int i = n-1; i >= 1; i--)
    {
        if (nums[i] != nums[n])
        {
            for (int j = i; j >= max(1,i-n+i+1); j--)
                nums[j] = nums[n];
            cnt++;
        }
    }
    cout << cnt << endl;
}

C. And Matching

在这里插入图片描述
题目大意:
在这里插入图片描述
思路:
我们知道n是2的次方,即n-1的各个位置上都是1
对于k < n-1 我们可以选择 k & n-1 ,此时结果为k
对于 k = n-1 我们可以选择 n-1 & n-2 和 1 & n-3 此时和为k
剩下的问题 我们只需要使其两两配对的&结果为0即可
在这里插入图片描述
不难发现对称位置的&结果为0
因为我们只需要选择i和n-i-1即可,对于k,我们选择0&(n-k-1)
代码:

void work()
{
    cin >> n >> m;
    if (m == n - 1)
    {
        if (n == 4)
        {
            cout << -1 << endl;
            return;
        }
        unordered_map<int, bool> M;
        M[n - 1] = M[n - 2] = M[n - 3] = M[0] = M[1] = M[2] = true;
        cout << n - 2 << " " << n - 1 << endl;
        cout << 1 << " " << n - 3 << endl;
        cout << 0 << " " << 2 << endl;
        for (int i = 3; i < n - 1; i++)
        {
            if (M[i])
                continue;
            cout << i << " " << n - i - 1 << endl;
            M[i] = M[n - i - 1] = true;
        }
        return;
    }
    cout << m << " " << (n - 1) << endl;
    unordered_map<int, bool> M;
    M[m] = true;
    M[n - 1] = true;
    for (int i = 1; i < n - 1; i++)
    {
        if (M[i])
            continue;
        if (M[n - i - 1] == true)
        {
            M[i] = true;
            cout << 0 << " " << i << endl;
            continue;
        }
        M[i] = M[n - i - 1] = true;
        cout << i << " " << n - i - 1 << endl;
    }
}

D. Range and Partition

在这里插入图片描述
题目大意:
在这里插入图片描述
思路:占坑待更

代码:

void work()
{
    cin >> n >> k;
    nums.resize(n);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
    oriNum = nums;
    sort(nums.begin(), nums.end());
    ans = nums[n - 1] - nums[0] + 1;
    for (int l = nums[0]; l <= nums[n - 1]; l++)
    {
        int nowL = lower_bound(nums.begin(), nums.end(), l) - nums.begin();
        int len = (n + k + 1) / 2;
        if (nowL + len - 1 >= n)
            continue;
        int nl = nums[nowL];
        int nr = nums[nowL + len - 1];
        if (ans > nr - nl)
        {
            ans = nr - nl;
            ansL = nl;
            ansR = nr;
        }
    }
    cout << ansL << " " << ansR << endl;
    int nowCnt = 0;
    int nowK = 0;
    int nowPos = 1;
    for (int i = 0; i < n; i++)
    {
        if (oriNum[i] >= ansL && oriNum[i] <= ansR)
            nowCnt++;
        else
            nowCnt--;
        if (nowCnt == 1 && nowK+1 < k)
        {
            cout << nowPos << " " << i + 1 << endl;
            nowPos = i + 2;
            nowCnt = 0;
            nowK++;
        }
    }
    cout << nowPos << " " << n << endl;
}

Q.E.D.