第二个测试点数据:here
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, s1[N], s2[N], p, ans;
struct node {
int l, r;
bool operator < (const node &t) const { return l < t.l || (l == t.l && r < t.r); }
} a[N];
bool f1(int t) {
p = 0;
for (int i = 1; i <= n; ++i) {
if (a[i].r <= a[p].r && t == 0) return 0;
if (a[i].l <= a[p].r) s1[i] = s1[i - 1] + max(a[i].r - a[p].r, 0);
else s1[i] = s1[i - 1] + a[i].r - a[i].l;
if (a[i].r > a[p].r) p = i;
}
return 1;
}
void f2() {
p = n + 1;
for (int i = n; i >= 1; --i) {
if (a[i].r >= a[p].l && p != (n + 1)) s2[i] = s2[i + 1] + max(a[i].r - a[p].l, 0);
else s2[i] = s2[i + 1] + a[i].r - a[i].l;
if (a[i].l < a[p].l) p = i;
if (i == n) p = i;
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + n + 1);
int pos = -1;
if (!f1(0)) {
f1(1);
printf("%d\n", s1[n]);
return 0;
}
f2();
// for (int i = 1; i <= n; ++i)
// cout << s1[i] << ' ' << s2[i] << endl;
// cout << endl;
for (int i = 1; i <= n; ++i) {
int kk = 0;
// if (i != 1 && i != n && a[i - 1].r > a[i + 1].l) kk = a[i - 1].r - a[i + 1].l;
ans = max(ans, s1[i - 1] + s2[i + 1] - kk);
// cout << kk << endl;
}
printf("%d\n", ans);
return 0;
}
求帮助