扫描线模板题。
class Solution {
public:
const int mod=1e9+7;
struct node1{
int l,r,sum,lazy;
}tr[210*8];
struct node2{
int x,y1,y2,tag;
bool operator<(const node2 &b){
return x<b.x;
}
};
vector<node2> e;
vector<int> s;
int find(int y){
return lower_bound(s.begin(),s.end(),y)-s.begin();
}
void pushup(int u){
if(tr[u].lazy){
tr[u].sum=s[tr[u].r+1]-s[tr[u].l];
}else if(tr[u].l!=tr[u].r){
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}else tr[u].sum=0;
}
void build(int u,int l,int r){
tr[u]={l,r,0,0};
if(l==r) return;
int m=(l+r)>>1;
build(u<<1,l,m);
build(u<<1|1,m+1,r);
}
void modify(int u,int l,int r,int tag){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].lazy+=tag;
pushup(u);
return;
}
int m=(tr[u].l+tr[u].r)>>1;
if(l<=m) modify(u<<1,l,r,tag);
if(r>m) modify(u<<1|1,l,r,tag);
pushup(u);
}
int rectangleArea(vector<vector<int>>& rectangles) {
int n=rectangles.size();
for(auto r:rectangles){
e.push_back({r[0],r[1],r[3],1});
e.push_back({r[2],r[1],r[3],-1});
s.push_back(r[1]);
s.push_back(r[3]);
}
sort(s.begin(),s.end());
s.erase(unique(s.begin(),s.end()),s.end());
sort(e.begin(),e.end());
build(1,0,2*n);
long long ans=0;
for(int i=0;i<e.size();i++){
if(i) (ans+=1LL*tr[1].sum*(e[i].x-e[i-1].x))%=mod;
modify(1,find(e[i].y1),find(e[i].y2)-1,e[i].tag);
}
return ans;
}
};
时间复杂度:O(nlogn)。
空间复杂度:O(n)。