Post

区间合并

区间合并

题设


给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。

题解


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
typedef pair<int,int> pii ;
vector<pii> nums,res ;

int main()
{
    int st=-2e9,ed=-2e9 ;  //ed代表区间结尾,st代表区间开头
    int n ;
    scanf("%d",&n) ; 
    
    while(n--)
    {
        int l,r ; 
        scanf("%d%d",&l,&r) ;
        nums.push_back({l,r}) ;
    }
    
    sort(nums.begin(),nums.end()) ;                 //按左端点排序
    
    for(auto num:nums)                   
    {
	    //情况1:两个区间无法合并
        if(ed<num.first)                            
        {
            if(ed!=-2e9) res.push_back({st,ed}) ;   //区间1放进res数组
            st=num.first,ed=num.second ;            //维护区间2
        }
        //情况2:两个区间可以合并,且区间1不包含区间2,区间2不包含区间1
        else if(ed<num.second)  
            ed=num.second ;                         //区间合并
    }  
    
    //(实际上也有情况3:区间1包含区间2,此时不需要任何操作,可以省略)

    //注:排过序之后,不可能有区间2包含区间1
	res.push_back({st,ed});
	printf("%d",res.size()) ;           //输出答案
    return 0 ;
}
  1. 因为在for循环前已经进行过sort排序了,所以不用担心放弃区间1转而维护区间2后,会导致后面如果遇到能和区间1合并的区间!
This post is licensed under CC BY 4.0 by the author.