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

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

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

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

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

    输入格式
    第一行包含整数n。

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

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

    数据范围
    1 ≤ n ≤ 100000,
    −10^9 ≤ l[i] ≤ r[i] ≤ 10^9
    输入样例:
    5
    1 2
    2 4
    5 6
    7 8
    7 9
    输出样例:
    3

    这个就很简单了,分为两种情况:

    1。区间有交集

    2。区间没有交集

    用pair来存放l与r。

    代码

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int N = 100010;
    int n;
    vector<PII> segs; 
    
    void merges(vector<PII> &segs)
    {
        vector<PII> res;
    
        sort(segs.begin(), segs.end());
    
        int st = -2e9, ed = -2e9;
        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});  //把最后一个区间放进去 也是防止一个区间都没有的情况
    
        segs = res;
    }
    
    int main()
    {
        cin >> n;
        for(int i = 0; i < n; i++)
        {
            int l, r;
            cin >> l >> r;
            segs.push_back({l, r});
        }
    
        merges(segs);
    
        cout << segs.size();
    
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    json的序列化 与 反序列化
    苹果审核被拒 2.3.10
    iOS基础问答面试
    论坛类应用双Tableview翻页效果实现
    iOS性能调优之Analyze静态分析
    win10 U盘安装ubuntu16.04双系统
    spring boot实战读书笔记1
    使用springBoot搭建REATFul风格的web demo
    es6编写generator报错
    vue开发环境搭建win10
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13406269.html
Copyright © 2011-2022 走看看