为什么RE(扫描线)

扫描线板子题,题目在洛谷 P5490 【模板】扫描线
样例都没过,提交全RE,求大佬帮忙
洛谷提交记录:
\displaystyle{^{\color{orange}\sf \large {SunSkydp}}_{\color{grey}\sf 2022.08.15}\ \ ^{\sf \colorbox{red}{Unaccepted}}_{\color{#red}\sf \large 0}\ \sf \ \ \ \color{blue} P5490 【模板】扫描线\ \ \ \ \color{grey}0ms/0B/2.60KB\ C^{_{_{++}}}14(GCC9) O2}
这组数据可过:
输入

2
1 2 4 3
2 1 4 3
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n, m;
const int N = 1600005;
vector<int> xx;
vector<array<int, 4>> line;
struct MIN{
    int minv, mincnt;
};
MIN operator + (const MIN &l, const MIN &r) {
    MIN a;
    a.minv = min(l.minv, r.minv);
    if(l.minv == r.minv) a.mincnt = l.mincnt + r.mincnt;
    else if(l.minv < r.minv) a.mincnt = l.mincnt;
    else a.mincnt = r.mincnt;
    return a;
}
struct node {
    int t;
    MIN val;
} seg[N * 8];

void update(int id) {
    seg[id].val = seg[id * 2].val + seg[id * 2 + 1].val;
}
void tag(int id,  int t) {
    seg[id].val.minv = seg[id].val.minv + t;
    seg[id].t = seg[id].t + t;
}
void pushdown(int id) {
    if(seg[id].t != 0) {
        seg[id * 2].val.minv = seg[id * 2].val.minv + seg[id].t;
        seg[id * 2].t = seg[id * 2].t + seg[id].t;
        seg[id * 2 + 1].val.minv = seg[id * 2 + 1].val.minv + seg[id].t;
        seg[id * 2 + 1].t = seg[id * 2 + 1].t + seg[id].t;
        //tag(id * 2, seg[id].t);
        //tag(id * 2 + 1, seg[id].t);
        seg[id].t = 0;
    }
}
void build(int id, int l, int r) {
    if(l == r) {
        seg[id].val = {0, xx[r] - xx[r - 1]};
    } else {
        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);  
        update(id);
    }
}
void modify(int id, int l, int r, int x, int y, int t) {
    if(l == x && y == r) {
        seg[id].val.minv = seg[id].val.minv + t;
        seg[id].t = seg[id].t + t;
        return ;
    }
    int mid = (l + r) / 2;
    pushdown(id);
    if(x <= mid) modify(id * 2, l, mid, x, y, t);
    else if(y > mid) modify(id * 2 + 1, mid + 1, r, x, y, t);
    else {
        modify(id * 2, l, mid, x, mid, t);
        modify(id * 2 + 1, mid + 1, r, mid + 1, y, t);
    }
    update(id);
}
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        int x1, x2, yy1, yy2;
        scanf("%d%d%d%d", &x1, &yy1, &x2, &yy2);
        xx.push_back(x1);
        xx.push_back(x2);
        line.push_back({yy1, 1, x1, x2});
        line.push_back({yy2, -1, x1, x2});
    }
    sort(line.begin(), line.end());
    sort(xx.begin(), xx.end());
    xx.erase(unique(xx.begin(), xx.end()), xx.end());
    m = xx.size() - 1;
    build(1, 1, m);
    int lasty = 0;
    int sumlen = seg[1].val.mincnt;
    ll ans = 0;
    for(auto lne : line) {
        int coverS = sumlen;
        if(seg[1].val.minv == 0) coverS = sumlen - seg[1].val.mincnt;
        ans += (ll) (lne[0] - lasty) * coverS;
        lasty = lne[0];
        int x1 = lower_bound(xx.begin(), xx.end(), lne[2]) - xx.begin() + 1;
        int x2 = lower_bound(xx.begin(), xx.end(), lne[3]) - xx.begin();
        if(x1 > x2) continue;
        modify(1, 1, m, x1, x2, lne[1]);
    }
    printf("%lld\n", ans);
    return 0;
}
2 个赞

额,怎么这么长啊!

2 个赞

还好吧,提高及以上的题目这样不算长了

2 个赞

直接unsigned long long试试?

不是这个问题

真的没有提高组的人来回答一下吗

蒟蒻挂机ing

好吧(萌新哭泣