-
Notifications
You must be signed in to change notification settings - Fork 0
/
D.cpp
129 lines (109 loc) · 2.92 KB
/
D.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include <algo/debug.h>
#else
#define debug(...) void(31)
#endif
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define REP(i, n) for (int i = 0; i < (int)n; ++i)
#define FOR(i, a, b) for (int i = (int)a; i <= (int)b; ++i)
#define FORD(i, b, a) for (int i = (int)b; i >= (int)a; --i)
#define EACH(v, a) for (auto& v : a)
#define SZ(a) ((int) a.size())
using ll = long long;
using pii = pair<int, int>;
using pli = pair<ll, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vll = vector<ll>;
using vvi = vector<vector<int>>;
int main() {
#ifdef LOCAL
freopen("inp/D3.in", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
int nTest;
cin >> nTest;
REP(_, nTest) {
int n;
cin >> n;
vi l(n), r(n);
l.clear(), r.clear();
vector<pii> heads;
set<pii> ranges;
map<int, int> hei;
REP(i, n) {
cin >> l[i] >> r[i];
debug(l[i], r[i]);
ranges.insert({l[i], r[i]});
// 0 -> begin, 1 -> end;
heads.pb({l[i], 0});
heads.pb({r[i], 1});
}
sort(all(heads));
debug(heads);
int open = 0, openAndClose = 0;
int lastVal = -1;
EACH(head, heads) {
if (head.first != lastVal && lastVal != -1) {
hei.insert({lastVal, openAndClose});
// reset
openAndClose = open;
}
lastVal = head.first;
// still at lastVal
if (head.second == 0) {
openAndClose++;
}
if (head.second == 1) {
// close
open--;
} else {
// open
open++;
};
}
if (lastVal != -1) {
hei.insert({lastVal, openAndClose});
}
int maxQ = 0;
vector<int> maxNodes;
EACH(h, hei) {
debug(h);
if (h.second > maxQ) {
maxQ = h.second;
maxNodes.clear();
maxNodes.pb(h.first);
} else if (h.second == maxQ) {
maxNodes.pb(h.first);
}
}
debug(maxNodes.size(), maxNodes);
int sz = SZ(maxNodes);
if (sz == 1) {
maxQ--;
} else if (sz >= 2) {
int first = maxNodes[0], second = maxNodes[sz - 1];
if (first > second) {
swap(first, second);
}
bool ok = false;
EACH(range, ranges) {
if (range.first <= first && range.second >= second) {
ok = true;
break;
}
}
if (ok) {
maxQ--;
}
}
cout << maxQ << endl;
debug("================");
debug(maxQ);
}
}