[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 @   俺叫西西弗斯  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2023-06-13 [第九届蓝桥杯省赛C++A/B组]全球变暖 原创
2023-06-13 词根词缀汇总表 原创
点击右上角即可分享
微信分享提示