51Nod-1091 线段的重叠 题解
题目概述
给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。
思路分析
对这些线段优先按照左端点升序排序
枚举每条线段,记录枚举过的线段能到达的最远距离
对于每条线段,如果有重叠,计算重叠的长度最大值
重叠长度的计算方式为:max(最远右端点, 当前右端点)- 当前左断点
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long llong;
const int N = 2e5 + 5;
const int MOD = 1e9 + 7;
llong n, m, x;
struct Node {
llong l, r;
Node(llong l = 0, llong r = 0) : l(l), r(r) { }
bool operator < (Node a) {
if (l == a.l) return r < a.r;
return l < a.l;
}
};
vector<Node> v;
int main() {
#ifdef LOCAL
freopen("D:/Code/ACM/in.in", "r", stdin);
freopen("D:/Code/ACM/out.out", "w", stdout);
#endif
cin.tie(0)->sync_with_stdio(0);
cin >> n;
for (int i = 0; i < n; i++) {
llong l, r; cin >> l >> r;
v.emplace_back(Node(l, r));
}
sort(v.begin(), v.end());
llong ans = 0, id = 0;
for (int i = 1; i < n; i++) {
if (v[i].l < v[id].r) {
ans = max(ans, min(v[id].r, v[i].r) - max(v[id].l, v[i].l));
}
if (v[i].r > v[id].r) {
id = i;
}
}
cout << ans << "\n";
return 0;
}