目录
- 代码答疑
扫描线模板
- @ 2026-3-15 8:54:14
扫描线模板: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 条评论
目前还没有评论...
京公网安备11010802045784号
YIZHIYANG 一只羊 LV 8