zoukankan      html  css  js  c++  java
  • 803. 区间合并

    给定 n 个区间 (l_i,r_i),要求合并所有有交集的区间。

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

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

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

    输入格式

    第一行包含整数n。

    接下来n行,每行包含两个整数 l 和 r。

    输出格式

    共一行,包含一个整数,表示合并区间完成后的区间个数。

    数据范围

    (1≤n≤100000,)
    (−10^9≤l_i≤r_i≤10^9)

    两种方法,都是先按照区间左端点排序,然后从左到右去看当前区间和下一个区间之间的包含关系来确定是更新当前区间还是合并成新的区间
    复杂度:(O(nlogn + n) = O(nlogn))
    模板1

    #include<iostream>
    #include<algorithm>
    #include<vector>
    
    using namespace std;
    
    #define PII pair<int, int>
    
    int n;
    vector<PII> segs;
    
    int main(){
        cin >> n;
        
        for(int i = 0; i < n; i ++){
            int l, r;
            cin >> l >> r;
            
            segs.push_back({l, r});
        }
        
        sort(segs.begin(), segs.end());
        
        int st = -2e9, ed = -2e9;
        vector<PII> res;
        
        for(auto seg : segs)
            if(ed < seg.first){
                if(st != -2e9) res.push_back({st, ed});
                st = seg.first;
                ed = seg.second;
            }else ed = max(ed, seg.second);
            
        if(st != -2e9) res.push_back({st, ed});
        
        cout << res.size() << endl;
        
        return 0;
    }
    

    模板2

    #include<iostream>
    #include<algorithm>
    #include<vector>
    
    using namespace std;
    
    #define PII pair<int, int>
    
    int n;
    vector<PII> segs;
    
    int main(){
        cin >> n;
        
        for(int i = 0; i < n; i ++){
            int l, r;
            cin >> l >> r;
            
            segs.push_back({l, r});
        }
        
        sort(segs.begin(), segs.end());
        
        int cnt = 1;
        
        for(int i = 1, j = 0; i < segs.size(); i ++)
            if(segs[j].second >= segs[i].first) 
                segs[j].second = max(segs[j].second, segs[i].second);
            else{
                cnt ++;
                j = i;
            }
            
        cout << min(cnt, segs.size()) << endl; // 此处为了防止segs为空
        
        return 0;
    }
    

    模板题:校门外的树

  • 相关阅读:
    【NXOpen.UF扩展】修改表达式
    NX二次开发 克隆
    C++手动加载CLR运行托管程序(CLR Hosting)
    C++/CLR 使用(VS2012,VS2013,VS2015)编写
    解决VS2015安装后stdio.h ucrtd.lib等文件无法识别问题,即include+lib环境变量配置
    NX 图标
    【错误分析】NX error status: 32
    NX CAM 读取加工参数
    CAM 模板样式表
    锁定NX原生界面 & 锁定界面更新
  • 原文地址:https://www.cnblogs.com/tomori/p/14312529.html
Copyright © 2011-2022 走看看