求此题正解
查看原帖
求此题正解
574944
Micnation_AFO楼主2022/9/25 11:18

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;
}

看到有人说这题难度大概是橙,所以是不是有什么比较简单的做法?

2022/9/25 11:18
加载中...