为何 N 要开到 1e6 才能过?
#include <bits/stdc++.h>
using namespace std;
#define ls(id) (id * 2)
#define rs(id) (id * 2 + 1)
#define lowbit(x) x&(-x)
#define fi first
#define se second
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
const int N = 1e6 + 5;
ll n;
struct Scanline {
ll x1, x2, y, opt;
bool operator < (const Scanline cmp) const {
return y < cmp.y;
}
} a[N << 1];
ll unix[N << 1];
struct Treenode {
ll len, sum;
} tr[N << 2];
ll ans;
void push_up(ll id, ll l, ll r) {
if (tr[id].sum) tr[id].len = unix[r+1] - unix[l];
else tr[id].len = tr[ls(id)].len + tr[rs(id)].len;
return ;
}
void Upd(ll id, ll l, ll r, ll x, ll y, ll opt) {
if (unix[r+1] <= x || unix[l] >= y) return ;
if (unix[l] >= x && unix[r+1] <= y) {
tr[id].sum += opt;
push_up(id, l, r);
return ;
}
ll mid = (l+r) >> 1;
Upd(ls(id), l, mid, x, y, opt);
Upd(rs(id), mid+1, r, x, y, opt);
push_up(id, l, r);
return ;
}
void Build(ll id, ll l, ll r) {
tr[id].len = tr[id].sum = 0;
if (l == r) return ;
ll mid = (l+r) >> 1;
Build(ls(id), l, mid);
Build(rs(id), mid+1, r);
return ;
}
int main(void) {
cin.tie(0);
cin >> n;
for (ll i = 1; i <= n; ++i) {
ll x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
a[2*i-1] = (Scanline){x1, x2, y1, 1};
a[2*i] = (Scanline){x1, x2, y2, -1};
unix[2*i-1] = x1, unix[2*i] = x2;
}
n <<= 1;
sort(a+1, a+n+1);
sort(unix+1, unix+n+1);
ll num = unique(unix+1, unix+n+1) - (unix+1);
Build(1, 1, num-1);
for (ll i = 1; i < n; ++i) {
Upd(1, 1, num-1, a[i].x1, a[i].x2, a[i].opt);
ans += (ll)tr[1].len * (ll)(a[i+1].y - a[i].y);
}
cout << ans;
return 0;
}