[Acwing] 803. 区间合并 原创
算法标签:贪心 区间和并
题目简叙

思路
合并区间可能遇到以下的三种状态:
 
 我们维护了一个区间来进行判定我们每次可以维护的长度
 lens(start,end)
如果是状态1:lens不发生改变
 如果是状态2:lens中的end进行更新扩展
else end = max(end,item.second);//状态1 维护并延长区间
如果是状态3:保存lens的状态,同时lens更新,lens.count++
 if(end<item.first){//状态2 更新到新的区间
            if(end!=LMax){//如果不是初始化
                tmpArr.push_back({start,end});//这里的时候 表示我们到了一个新的区间 所以压入上一段区间
            }
            start = item.first;
            end = item.second;
        }
如果我们实际进行处理:
 
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 100000+10;
const int LMax = -2e9;
typedef pair<int,int>PII;
vector<PII>arr;
vector<PII>tmpArr;
void merge(vector<PII> &arr){
    sort(arr.begin(),arr.end());
    
    int start = LMax,end = LMax;//维护的区间
    for(auto item:arr){
        if(end<item.first){//状态2 更新到新的区间
            if(end!=LMax){//如果不是初始化
                tmpArr.push_back({start,end});//这里的时候 表示我们到了一个新的区间 所以压入上一段区间
            }
            start = item.first;
            end = item.second;
        }
        else end = max(end,item.second);//状态1 维护并延长区间
    }
    
    if(start!=LMax)tmpArr.push_back({start,end});//放入末尾最后的一个区间,
    
    arr = tmpArr;//覆盖
}
int main(){
    int n;
    int l,r;
    cin>>n;
    while(n--){cin>>l>>r;arr.push_back({l,r});}
    
    merge(arr);
    
    cout<<arr.size();
    
    return 0;
}
AC记录

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号