SHOW:
|
|
- or go back to the newest paste.
1 | #include <bits/stdc++.h> | |
2 | using namespace std; | |
3 | #define int long long | |
4 | #define SZ(x) (int)(x.size()) | |
5 | ||
6 | struct seg{ | |
7 | int x, y1, y2; | |
8 | int del;//1 -> add, -1 -> minus | |
9 | }arr[200005]; | |
10 | bool cmp(seg a, seg b){ | |
11 | return a.x < b.x; | |
12 | } | |
13 | ||
14 | struct node{ | |
15 | node *lch, *rch; | |
16 | int l, r, mid, tag, minval, cnt;//we have cnt minval | |
17 | node(int L, int R){ | |
18 | l = L; r = R; | |
19 | mid = (l+r) / 2; | |
20 | tag = minval = 0; | |
21 | cnt = r-l+1; | |
22 | if(l != r)lch = new node(l, mid); | |
23 | else lch = nullptr; | |
24 | if(l != r)rch = new node(mid+1, r); | |
25 | else rch = nullptr; | |
26 | } | |
27 | void pushtag(){ | |
28 | lch->tag += tag; | |
29 | rch->tag += tag; | |
30 | lch->minval += tag; | |
31 | rch->minval += tag; | |
32 | tag = 0; | |
33 | } | |
34 | void add(int L, int R, int V){ | |
35 | //cout << l << ' ' << L << ' ' << r << ' ' << R << '\n'; | |
36 | if(L == l && R == r){ | |
37 | minval += V; | |
38 | tag += V; | |
39 | return; | |
40 | } | |
41 | if(lch == nullptr || rch == nullptr)return;// test | |
42 | pushtag(); | |
43 | if(L <= mid)lch->add(L, min(R, mid), V); | |
44 | if(R > mid)rch->add(max(L, mid+1), R, V); | |
45 | minval = min(lch->minval, rch->minval); | |
46 | if(lch->minval == rch->minval)cnt = lch->cnt + rch->cnt; | |
47 | else if(minval == lch->minval)cnt = lch->cnt; | |
48 | else if(minval == rch->minval)cnt = rch->cnt; | |
49 | //cout << l << ' ' << r << ' ' << cnt << ' ' << minval << endl;; | |
50 | } | |
51 | }; | |
52 | ||
53 | node *root; | |
54 | ||
55 | int32_t main(){ | |
56 | int n; | |
57 | cin >> n; | |
58 | root = new node(1, 1000000); | |
59 | for(int i = 0; i < n; ++i){ | |
60 | int l,r,d,u; | |
61 | cin >> l >> r >> d >> u; | |
62 | arr[i<<1] = {.x = l, .y1 = d, .y2 = u, .del = 1}; | |
63 | arr[i<<1|1] = {.x = r, .y1 = d, .y2 = u, .del = -1}; | |
64 | } | |
65 | n *= 2; | |
66 | sort(arr, arr+n, cmp); | |
67 | int ans = 0; | |
68 | for(int i = 0; i < n; ++i){ | |
69 | if(i != 0){ | |
70 | if(root->minval != 0)ans += (arr[i].x-arr[i-1].x) * (root->r-root->l+1); | |
71 | else ans += (arr[i].x-arr[i-1].x) * (root->r-root->l+1 - root->cnt); | |
72 | //cout << arr[i].x-arr[i-1].x << ' ' << root->r-root->l+1 - root->cnt << ' ' << ans << '\n'; | |
73 | } | |
74 | root->add(arr[i].y1+1, arr[i].y2, arr[i].del); | |
75 | //cout << arr[i].x << ' ' << arr[i].y1 << ' ' << arr[i].y2 << ' ' << arr[i].del << '\n';; | |
76 | } | |
77 | cout << ans << '\n'; | |
78 | return 0; | |
79 | } |