1285E. Delete a Segment
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
There are n
segments on a Ox axis [l1,r1], [l2,r2], …, [ln,rn]. Segment [l,r] covers all points from l to r inclusive, so all x such that l≤x≤r
.
Segments can be placed arbitrarily — be inside each other, coincide and so on. Segments can degenerate into points, that is li=ri
is possible.
Union of the set of segments is such a set of segments which covers exactly the same set of points as the original set. For example:
if n=3
and there are segments [3,6], [100,100], [5,8] then their union is 2 segments: [3,8] and [100,100]
;
if n=5
and there are segments [1,2], [2,3], [4,5], [4,6], [6,6] then their union is 2 segments: [1,3] and [4,6]
.
Obviously, a union is a set of pairwise non-intersecting segments.
You are asked to erase exactly one segment of the given n
so that the number of segments in the union of the rest n−1
segments is maximum possible.
For example, if n=4
and there are segments [1,4], [2,3], [3,6], [5,7]
, then:
erasing the first segment will lead to [2,3]
, [3,6], [5,7] remaining, which have 1
segment in their union;
erasing the second segment will lead to [1,4]
, [3,6], [5,7] remaining, which have 1
segment in their union;
erasing the third segment will lead to [1,4]
, [2,3], [5,7] remaining, which have 2
segments in their union;
erasing the fourth segment will lead to [1,4]
, [2,3], [3,6] remaining, which have 1
segment in their union.
Thus, you are required to erase the third segment to get answer 2
.
Write a program that will find the maximum number of segments in the union of n−1
segments if you erase any of the given n
segments.
Note that if there are multiple equal segments in the given set, then you can erase only one of them anyway. So the set after erasing will have exactly n−1
segments.
Input
The first line contains one integer t
(1≤t≤104) — the number of test cases in the test. Then the descriptions of t
test cases follow.
The first of each test case contains a single integer n
(2≤n≤2⋅105) — the number of segments in the given set. Then n lines follow, each contains a description of a segment — a pair of integers li, ri (−109≤li≤ri≤109), where li and ri are the coordinates of the left and right borders of the i
-th segment, respectively.
The segments are given in an arbitrary order.
It is guaranteed that the sum of n
over all test cases does not exceed 2⋅105
.
Output
Print t
integers — the answers to the t given test cases in the order of input. The answer is the maximum number of segments in the union of n−1 segments if you erase any of the given n segments.
input:
3
4
1 4
2 3
3 6
5 7
3
5 5
5 5
5 5
6
3 3
1 1
5 5
1 5
2 2
4 4
output:
2
1
5
大佬的ac代码:
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9+7;
const int MAXN = 400000;
const long long INF = 1e13;
typedef pair<int,int> interval;
#define l first
#define r second
void solve() {
int n;
cin >> n;
vector < interval > v(n);
for(int i = 0; i < n; i++)
cin >> v[i].l >> v[i].r;
sort(v.begin(),v.end());
int max_r[n], pans[n];
for(int i = 0; i < n; i++) {
if(i == 0) {
max_r[i] = v[i].r;
pans[i] = 1;
}
else {
if(v[i].l <= max_r[i-1])
pans[i] = pans[i-1];
else
pans[i] = pans[i-1] + 1;
max_r[i] = max(max_r[i-1],v[i].r);
}
}
int ans = 0;
vector<interval> sans_st;
for(int i = n-1; i >= 0; i--) {
int sans = sans_st.size();
if(i == 0) {
ans = max(ans, (int)sans_st.size());
break;
}
int L, R;
L = 0; R = sans_st.size()-1;
while(L < R) {
int m = (L+R) / 2;
if(sans_st[m].l <= max_r[i-1])
R = m;
else
L = m+1;
}
if(!sans_st.empty() && sans_st[L].l > max_r[i-1]) L++;
sans -= (sans_st.size() - L);
ans = max(ans, pans[i-1] + sans);
int new_r = v[i].r;
while(!sans_st.empty() && new_r >= sans_st[sans_st.size()-1].l) {
new_r = max(new_r,sans_st[sans_st.size()-1].r);
sans_st.pop_back();
}
sans_st.push_back({v[i].l,new_r});
}
cout << ans << endl;
}
int main() {
ios_base::sync_with_stdio(false);
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int tst;
cin >> tst;
while(tst--)
solve();
}