1
+ /* *
2
+ * @file 2740.cpp
3
+ * @author Macesuted ([email protected] )
4
+ * @date 2023-02-08
5
+ *
6
+ * @copyright Copyright (c) 2023
7
+ *
8
+ */
9
+
10
+ #include < bits/stdc++.h>
11
+ using namespace std ;
12
+
13
+ #ifndef LOCAL
14
+ #define endl ' \n '
15
+ #endif
16
+
17
+ bool mem1;
18
+
19
+ #define maxn 400005
20
+
21
+ typedef pair<int , int > pii;
22
+
23
+ class SegmentTree {
24
+ private:
25
+ pii tree[maxn << 2 ];
26
+ int n;
27
+
28
+ pii merge (pii a, pii b) { return {a.first + b.first , min (a.second , a.first + b.second )}; }
29
+ void pushUp (int p) { return tree[p] = merge (tree[p << 1 ], tree[p << 1 | 1 ]), void (); }
30
+ void update (int p, int l, int r, int qp, int v) {
31
+ if (l == r) return tree[p] = {v, min (0 , v)}, void ();
32
+ int mid = (l + r) >> 1 ;
33
+ qp <= mid ? update (p << 1 , l, mid, qp, v) : update (p << 1 | 1 , mid + 1 , r, qp, v);
34
+ return pushUp (p);
35
+ }
36
+ pii query (int p, int l, int r, int ql, int qr) {
37
+ if (ql <= l && r <= qr) return tree[p];
38
+ int mid = (l + r) >> 1 ;
39
+ if (qr <= mid) return query (p << 1 , l, mid, ql, qr);
40
+ if (ql > mid) return query (p << 1 | 1 , mid + 1 , r, ql, qr);
41
+ return merge (query (p << 1 , l, mid, ql, qr), query (p << 1 | 1 , mid + 1 , r, ql, qr));
42
+ }
43
+
44
+ public:
45
+ void resize (int _n) { return n = _n, void (); }
46
+ void update (int p, int v) { return update (1 , 1 , n, p, v); }
47
+ pii query (int l, int r) { return l > r ? pii{0 , 0 } : query (1 , 1 , n, l, r); }
48
+ } ST;
49
+
50
+ pii a[maxn];
51
+ stack<int > S[maxn >> 1 ];
52
+
53
+ void solve (void ) {
54
+ int n;
55
+ cin >> n, ST.resize (2 * n);
56
+ for (int i = 1 ; i <= n; i++) cin >> a[i].first >> a[i].second ;
57
+ for (int i = 1 ; i <= n; i++) cin >> a[n + i].first >> a[n + i].second , a[n + i].first *= -1 ;
58
+ sort (a + 1 , a + 2 * n + 1 , [](const pii& a, const pii& b) {
59
+ return a.second < b.second || (a.second == b.second && a.first > 0 && b.first < 0 );
60
+ });
61
+ int ans = n;
62
+ for (int i = 1 ; i <= 2 * n; i++) {
63
+ ST.update (i, a[i].first / abs (a[i].first ));
64
+ if (a[i].first > 0 ) {
65
+ S[a[i].first ].push (i);
66
+ continue ;
67
+ }
68
+ if (!S[-a[i].first ].empty ()) {
69
+ int p = S[-a[i].first ].top ();
70
+ if (ST.query (1 , p - 1 ).first + ST.query (p + 1 , i - 1 ).second >= 0 )
71
+ ans--, S[-a[i].first ].pop (), ST.update (p, 0 ), ST.update (i, 0 );
72
+ }
73
+ }
74
+ cout << ans << endl;
75
+ return ;
76
+ }
77
+
78
+ bool mem2;
79
+
80
+ int main () {
81
+ ios::sync_with_stdio (false ), cin.tie (nullptr );
82
+ #ifdef LOCAL
83
+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
84
+ #endif
85
+
86
+ int _ = 1 ;
87
+ while (_--) solve ();
88
+
89
+ #ifdef LOCAL
90
+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
91
+ #endif
92
+ return 0 ;
93
+ }
0 commit comments