rt,写了一个很烂、很难调的代码,虽然 AC 了,但感觉不是正解
#include <iostream>
using namespace std;
const int N = 300010;
#define left LLeft
#define right RRight
#define int long long
struct Segment {
int l, r;
} a[N];
int n;
int t[N], tl[N], tr[N];
int num[N];
int left[N], right[N];
int is_left[N];
bool flag[N];
signed main() {
cin >> n;
int mx = -N;
for (int i = 1; i <= n; i++) {
cin >> a[i].l >> a[i].r;
mx = max(mx, a[i].l), mx = max(mx, a[i].r);
t[a[i].l]++, t[a[i].r]++;
num[a[i].l] = i, num[a[i].r] = i;
tl[a[i].l]++, tr[a[i].r]++;
if (a[i].l == a[i].r) flag[a[i].l] = true;
if (is_left[a[i].r] == 1) flag[a[i].r] = true;
if (is_left[a[i].l] == 2) flag[a[i].l] = true;
is_left[a[i].l] = 1, is_left[a[i].r] = 2;
}
int suml = 0, sumr = 0;
for (int i = 1; i <= mx; i++) {
suml += tl[i], sumr += tr[i];
left[i] = suml, right[i] = sumr;
//if (tl[i]) left[i]--;
//if (tr[i]) right[i]--;
}
//cout << left[1] << endl;
int last = 1;
bool flag1 = false;
Segment ans;
int Ans = 0;
for (int i = 1; i <= mx; i++) {
if (!t[i] && !t[i + 1]) continue;
if (!t[i]) {
if (flag1) ans.l = last, ans.r = i;
else ans.l = last + 1, ans.r = i;
Ans = max(Ans, (ans.r - ans.l) * (left[ans.l] - right[ans.r]));
//cout << Ans << " " << i << endl;
continue;
}
if (flag[i]) { last = i, flag1 = false; continue; }
if (flag1) ans.l = last;
else ans.l = last + 1;
if (is_left[i] == 2) ans.r = i;
else ans.r = i - 1;
flag1 = (is_left[i] == 1 ? true : false), last = i;
//if (t[i] != 1) lid = 0;
Ans = max(Ans, (ans.r - ans.l) * (left[ans.l] - right[ans.l]));
//if (Ans == 6) cout << i << endl;
}
cout << Ans << endl;
return 0;
}
看到有人说这题难度大概是橙,所以是不是有什么比较简单的做法?