题目链接: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(); }