2020年1月中旬

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

扫描二维码关注公众号,回复: 8817376 查看本文章

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();
     
    }
发布了267 篇原创文章 · 获赞 38 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/dghcs18/article/details/104013713
今日推荐