#include <bits/stdc++.h>
#define int long long
#define lx (x * 2)
#define rx (x * 2 + 1)
#define mid ((l + r) >> 1)
using namespace std;
int read()
{
int x = 0, f = 1;
char ch = 0;
while(!isdigit(ch))
{
if(ch == '-')
{
f = -1;
}
ch = getchar();
}
while(isdigit(ch))
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
const int N = 100000;
int n;
struct Sl
{
int y, l, r, f;
bool operator < (const Sl &t) const
{
return y < t.y;
}
}sl[N * 2 + 5];
int sub[N * 2 + 5];
struct Tr
{
int sum, cnt, len;
}tr[N * 2 * 15 + 5];
void build(int x, int l, int r)
{
if(l == r)
{
tr[x].sum = sub[l + 1] - sub[l];
return;
}
build(lx, l, mid);
build(rx, mid + 1, r);
tr[x].sum = tr[lx].sum + tr[rx].sum;
}
void add(int x, int l, int r, int id)
{
if(l >= sl[id].l && r <= sl[id].r)
{
tr[x].cnt += sl[id].f;
if(tr[x].cnt > 0)
{
tr[x].len = tr[x].sum;
}
else
{
tr[x].len = tr[lx].len + tr[rx].len;
}
return;
}
if(sl[id].l <= mid)
{
add(lx, l, mid, id);
}
if(sl[id].r > mid)
{
add(rx, mid + 1, r, id);
}
if(tr[x].cnt > 0)
{
tr[x].len = tr[x].sum;
}
else
{
tr[x].len = tr[lx].len + tr[rx].len;
}
}
void init()
{
n = read();
for(int i = 1; i <= n; i++)
{
int x1, y1, x2, y2;
x1 = read(), y1 = read(), x2 = read(), y2 = read();
sl[(i - 1) * 2 + 1] = {y1, x1, x2, 1};
sl[i * 2] = {y2, x1, x2, -1};
sub[(i - 1) * 2 + 1] = x1, sub[i * 2] = x2;
}
n *= 2;
sort(sub + 1, sub + n + 1);
sort(sl + 1, sl + n + 1);
// for(int i = 1; i <= n; i++)
// {
// printf("%lld ", sub[i]);
// }
sub[n + 1] = sub[n];
// printf("\n");
build(1, 1, n);
// printf("%lld\n", tr[1].sum);
for(int i = 1; i <= n; i++)
{
sl[i].l = lower_bound(sub + 1, sub + n + 1, sl[i].l) - sub;
sl[i].r = lower_bound(sub + 1, sub + n + 1, sl[i].r) - sub - 1;
}
// for(int i = 1; i <= n; i++)
// {
// printf("%lld %lld\n", sl[i].l, sl[i].r);
// }
}
void solve()
{
int sum = 0;
for(int i = 1; i < n; i++)
{
// printf("111\n");
// printf("%lld %lld\n", sl[i].l, sl[i].r);
add(1, 1, n, i);
// printf("%lld\n", tr[1].len);
sum += tr[1].len * (sl[i + 1].y - sl[i].y);
}
printf("%lld", sum);
}
signed main()
{
// freopen("scan.in", "r", stdin);
// freopen("scan111.out", "w", stdout);
init();
solve();
return 0;
}
第 67 行,为了防止数组越界我本来写的是 else if(l != r),但这样改完就错了,想问一下为什么,如果叶子节点代表的这一段区间的 cnt 为 0 不就意味着覆盖的长度为 0 吗