目录

扫描线模板:https://www.luogu.com.cn/problem/P5490


#include<bits/stdc++.h>
using namespace std;
using ll = long long;

struct S {
    ll x, d, u, w;
    bool operator<(const S& o) const {
        return x < o.x;
    }
} a[200005];

ll y[200005];
ll c[800005], l[800005];

void up(int p, int L, int R) {
    if (c[p]) {
        l[p] = y[R] - y[L];
    } else if (L + 1 == R) {
        l[p] = 0;
    } else {
        l[p] = l[p * 2] + l[p * 2 + 1];
    }
}

void add(int p, int L, int R, int ql, int qr, int v) {
    if (ql <= L && R <= qr) {
        c[p] += v;
        up(p, L, R);
        return;
    }
    int m = (L + R) / 2;
    if (ql < m) add(p * 2, L, m, ql, qr, v);
    if (qr > m) add(p * 2 + 1, m, R, ql, qr, v);
    up(p, L, R);
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n;
    cin >> n;
    int m = 0;
    for (int i = 1; i <= n; ++i) {
        ll xa, ya, xb, yb;
        cin >> xa >> ya >> xb >> yb;
        a[++m] = {xa, ya, yb, 1};
        y[m] = ya;
        a[++m] = {xb, ya, yb, -1};
        y[m] = yb;
    }
    sort(a + 1, a + m + 1);
    sort(y + 1, y + m + 1);
    int k = unique(y + 1, y + m + 1) - y - 1;
    ll ans = 0;
    for (int i = 1; i < m; ++i) {
        int ql = lower_bound(y + 1, y + k + 1, a[i].d) - y;
        int qr = lower_bound(y + 1, y + k + 1, a[i].u) - y;
        if (ql < qr) add(1, 1, k, ql, qr, a[i].w);
        ans += l[1] * (a[i + 1].x - a[i].x);
    }
    cout << ans << "\n";
    return 0;
}

0 条评论

目前还没有评论...