#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
struct node {
ll x, yh, yl;
int flag;
}E[N * 4];
struct edge {
ll l, r, flag, len;
}tree[N * 4];
ll rk[N * 4], val[N * 4];
int n, cnt = 1;
ll ans, max_y;
void pushup(int id) {
if (tree[id].l == max_y && tree[id].r == max_y) {
return;
}
if (tree[id].flag) {
tree[id].len = val[tree[id].r + 1] - val[tree[id].l];
} else {
tree[id].len = tree[id << 1].len + tree[id << 1 | 1].len;
}
}
void build(int id, int l, int r) {
tree[id].l = l;
tree[id].r = r;
tree[id].flag = tree[id].len = 0;
if (l == r) {
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
}
void update(int id, ll l, ll r, ll val) {
if (l <= tree[id].l && tree[id].r <= r) {
tree[id].flag += val;
pushup(id);
return;
}
int mid = (tree[id].l + tree[id].r) >> 1;
if (l <= mid) {
update(id << 1, l, mid, val);
}
if (r > mid) {
update(id << 1 | 1, mid + 1, r, val);
}
pushup(id);
}
bool cmp(const node& x, const node& y) {
if (x.x != y.x) {
return x.x < y.x;
}
return x.flag > y.flag;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
ll x, y, xx, yy;
cin >> x >> y >> xx >> yy;
E[cnt].x = x;
E[cnt].yh = yy;
E[cnt].yl = y;
E[cnt].flag = 1;
rk[cnt++] = y;
E[cnt].x = xx;
E[cnt].yh = yy;
E[cnt].yl = y;
E[cnt].flag = -1;
rk[cnt++] = yy;
}
sort(rk + 1, rk + cnt + 1);
int len = unique(rk + 1, rk + cnt + 1) - (rk + 1);
for (int i = 1; i <= cnt; i++) {
ll pos1 = lower_bound(rk + 1, rk + len + 1, E[i].yh) - (rk + 1);
ll pos2 = lower_bound(rk + 1, rk + len + 1, E[i].yl) - (rk + 1);
val[pos1] = E[i].yh;
val[pos2] = E[i].yl;
E[i].yh = pos1;
E[i].yl = pos2;
max_y = max(max_y, pos1);
}
sort(E + 1, E + cnt + 1, cmp);
build(1, 1, cnt);
for (int i = 1; i < cnt; i++) {
update(1, E[i].yl, E[i].yh - 1, E[i].flag);
ans += tree[1].len * (E[i + 1].x - E[i].x);
}
cout << ans;
return 0;
}
样例:
输入
2
100 100 200 200
150 150 250 255
输出
18000
输出 20750,求调。