萌新求助40分,4号回关
查看原帖
萌新求助40分,4号回关
347589
Zelotz楼主2021/8/17 11:49

第二个测试点数据: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;
}

求帮助

2021/8/17 11:49
加载中...