Problem - D - Codeforces
题意:
思路:
这是个分类讨论题,一开始还以为是枚举什么的,发现根本枚举不了
注意到最终的答案就两种情况:区间包含 or 区间不包含
对于第一种情况,贡献的最大值就是mxlen - milen的2倍,这个没啥好说的
对于第二种情况:
如果两个区间有交,那么贡献就是不相交的两部分取大
如果两个区间无交,那么贡献就是两个len取大
实现的话就是把左端点和右端点单独拿出来就好
Code:
#include <bits/stdc++.h>
#define int long long
constexpr int N = 2e5 + 10;
constexpr int mod = 998244353;
int n, m;
int l[N], r[N];
int len[N];
void solve() {
std::cin >> n >> m;
for (int i = 1; i <= n; i ++) {
std::cin >> l[i] >> r[i];
len[i] = r[i] - l[i] + 1;
}
int ans = 0;
int milen = *std::min_element(len + 1, len + 1 + n);
int mxlen = *std::max_element(len + 1, len + 1 + n);
ans = std::max(ans, mxlen - milen);
int mxl = *std::max_element(l + 1, l + 1 + n);
int mir = *std::min_element(r + 1, r + 1 + n);
for (int i = 1; i <= n; i ++) {
ans = std::max(ans, std::min(len[i], std::max(mxl - l[i], r[i] - mir)));
}
std::cout << 2 * ans << "\n";
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t = 1;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}