-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathArea_of_Rectangles.cpp
48 lines (48 loc) · 1.64 KB
/
Area_of_Rectangles.cpp
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
struct AreaofRectangles{
#define cl(x) (x<<1)
#define cr(x) (x<<1|1)
ll n, id, sid;
pair<ll,ll> tree[MXN<<3]; // count, area
vector<ll> ind;
tuple<ll,ll,ll,ll> scan[MXN<<1];
void pull(int i, int l, int r){
if(tree[i].first) tree[i].second = ind[r+1] - ind[l];
else if(l != r){
int mid = (l+r)>>1;
tree[i].second = tree[cl(i)].second + tree[cr(i)].second;
}
else tree[i].second = 0;
}
void upd(int i, int l, int r, int ql, int qr, int v){
if(ql <= l && r <= qr){
tree[i].first += v;
pull(i, l, r); return;
}
int mid = (l+r) >> 1;
if(ql <= mid) upd(cl(i), l, mid, ql, qr, v);
if(qr > mid) upd(cr(i), mid+1, r, ql, qr, v);
pull(i, l, r);
}
void init(int _n){
n = _n; id = sid = 0;
ind.clear(); ind.resize(n<<1);
fill(tree, tree+(n<<2), make_pair(0, 0));
}
void addRectangle(int lx, int ly, int rx, int ry){
ind[id++] = lx; ind[id++] = rx;
scan[sid++] = make_tuple(ly, 1, lx, rx);
scan[sid++] = make_tuple(ry, -1, lx, rx);
}
ll solve(){
sort(ind.begin(), ind.end());
ind.resize(unique(ind.begin(), ind.end()) - ind.begin());
sort(scan, scan + sid);
ll area = 0, pre = get<0>(scan[0]);
for(int i = 0; i < sid; i++){
auto [x, v, l, r] = scan[i];
area += tree[1].second * (x-pre);
upd(1, 0, ind.size()-1, lower_bound(ind.begin(), ind.end(), l)-ind.begin(), lower_bound(ind.begin(),ind.end(),r)-ind.begin()-1, v);
pre = x;
}
return area;
} }rect;