Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle(数学/双指针)

题目链接:https://codeforces.com/contest/1366/problem/B

题意

大小为 $n$ 的数组 $a$,除了 $a_x = 1$,其余 $a_i = 0$,依次给出 $m$ 个区间,可以选择区间中的两个元素交换(可相同),问最多有多少个元素可能为 $1$ 。

题解

如果一个区间包含 $x$,那么可能为 $1$ 的元素范围即扩大至了整个区间,对于接下来的区间,判断是否与当前可能为 $1$ 的区间相交即可,相交则继续扩大区间范围,如此重复。

判断两个区间是否相交: max(l, al) <= min(r, ar) 

判断两个区间是否不相交: r < al or l > ar 

代码一

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n, x, m; cin >> n >> x >> m;
    int al = x, ar = x;
    for (int i = 0; i < m; i++) {
        int l, r; cin >> l >> r;
        if (max(l, al) <= min(r, ar)) {
            al = min(al, l);
            ar = max(ar, r);
        }
    }
    cout << ar - al + 1 << "
";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}

代码二

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n, x, m; cin >> n >> x >> m;
    int al = x, ar = x;
    for (int i = 0; i < m; i++) {
        int l, r; cin >> l >> r;
        if (r < al or l > ar) continue;
        al = min(al, l);
        ar = max(ar, r);
    }
    cout << ar - al + 1 << "
";
}

int main() {
    int t; cin >> t;
    while (t--) solve();
}
原文地址:https://www.cnblogs.com/Kanoon/p/13098137.html