[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记录

在这里插入图片描述

posted @ 2024-06-13 22:47  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源