扫描线

扫描线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include<bits/stdc++.h>
using namespace std;
int n;
long long c[800001];
long long len[800001];
struct segment{
long long l,r,h;
short type;
}s[200001];
int d[400001];
int zip[400001];
int tot;
inline void add(int t,int l,int r,int x,int y,long long k)
{
if(x<=l&&y>=r)
{
c[t]+=k;
if(c[t])
{
len[t]=zip[r+1]-zip[l];
}
else
{
if(l==r)
{
len[t]=0;
}
else
{
len[t]=len[t<<1]+len[t<<1|1];
}
}
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
{
add(t<<1,l,mid,x,y,k);
}
if(y>mid)
{
add(t<<1|1,mid+1,r,x,y,k);
}
if(!c[t])
{
if(l==r)
{
len[t]=0;
}
else
{
len[t]=len[t<<1]+len[t<<1|1];
}
}
return ;
}
bool cmp(segment a,segment b)
{
return a.h<b.h;
}
long long ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i*2-1].l;
cin>>s[i*2-1].h;
cin>>s[i*2-1].r;
s[i*2-1].type=1;
s[i*2].l=s[i*2-1].l;
s[i*2].r=s[i*2-1].r;
cin>>s[i*2].h;
s[i*2].type=-1;
zip[i*2-1]=s[i*2-1].l;
zip[i*2]=s[i*2-1].r;
}
sort(s+1,s+2*n+1,cmp);
sort(zip+1,zip+2*n+1);
tot=unique(zip+1,zip+2*n+1)-zip-1;
for(int i=1;i<2*n;i++)
{
add(1,1,tot,lower_bound(zip+1,zip+tot+1,s[i].l)-zip,lower_bound(zip+1,zip+tot+1,s[i].r)-zip-1,s[i].type);
ans+=(long long)len[1]*(s[i+1].h-s[i].h);
}
cout<<ans<<endl;
return 0;
}