```
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r,h;
bool flag;
node(int _l,int _r,int _h,bool _fl){
l = _l;
r = _r;
h = _h;
flag = _fl;
}
};
const int N = 5e3 + 10;
vector <node> v;
struct tree{
int sum;
int cnt;
int len;
bool l,r;
};
tree root[N << 2];
int n;
int mx,mn;
bool cmp(node a,node b){
return a.h < b.h || a.h == b.h && a.flag > b.flag;
}
void push_up(int u,int l,int r){
if(root[u].sum){
root[u].cnt = 1;
root[u].len = r - l + 1;
root[u].l = root[u].r = 1;
}
else if(l == r){
root[u].cnt = 0;
root[u].len = 0;
root[u].l = root[u].r = 0;
}
else{
root[u].len = root[u << 1].len + root[u << 1 | 1].len;
root[u].cnt = root[u << 1].cnt + root[u << 1 | 1].cnt;
if(root[u << 1].r && root[u << 1 | 1].l) root[u].cnt--;
root[u].l = root[u << 1].l;
root[u].r = root[u << 1 | 1].r;
}
}
void add(int u,int l,int r,int from,int to,int value){
if(l >= from && to >= r){
root[u].sum += value;
push_up(u,l,r);
return;
}
int mid = (l + r) >> 1;
if(mid >= from) add(u >> 1,l,mid,from,to,value);
if(to > mid) add(u >> 1 | 1,mid + 1,r,from,to,value);
push_up(u,l,r);
}
int ans;
int last;
int main(){
scanf("%d",&n);
mx = -0x7f7f7f7f;
mn = 0x7f7f7f7f;
for(int i = 1;i <= n;i++){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
mx = max(mx,max(x1,x2));
mn = min(mn,min(x1,x2));
v.push_back(node(x1,x2,y1,1));
v.push_back(node(x1,x2,y2,-1));
}
if(mn <= 0){ //若为负的坐标,移到第一象限
for(int i = 0;i < v.size();i++){
v[i].l += 1 - mn;
v[i].r += 1 - mn;
}
mx -= mn;
}
stable_sort(v.begin(),v.end(),cmp);
for(int i = 0;i < v.size();i++){
add(1,1,mx,v[i].l,v[i].r - 1,v[i].flag);
while(v[i].h == v[i + 1].h && v[i].flag == v[i + 1].flag){
i++;
add(1,1,mx,v[i].l,v[i].r - 1,v[i].flag);
}
ans += abs(root[1].len - last);
last = root[1].len;
ans += root[1].cnt * 2 * (v[i + 1].h - v[i].h);
}
printf("%d",ans);
}
```
by Joseph_H @ 2022-10-16 19:39:33