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

    AcWing 803.区间合并

    题目描述

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

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

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

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

    输入格式

    第一行包含整数n。

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

    输出格式

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

    数据范围

    1≤n≤100000,
    −109≤li≤ri≤109

    输入样例:

    5
    1 2
    2 4
    5 6
    7 8
    7 9

    输出样例:
    3

    题解

    这个题目是贪心 + 模拟,先按区间的左端点给每个区间排序,然后扫描每一个区间即可

    代码如下

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int N = 1e5 + 10;
    int n;
    vector<PII> segs;
    
    vector<PII> meger(vector<PII>& segs){
        vector<PII> ret;
    
        sort(segs.begin(), segs.end());
    
        int st = -2e9, ed = -2e9;//初始区间的端点
        //这里做的是扫描区间
        for(auto seg: segs){
            if(ed < seg.first){
                if(st != -2e9) ret.push_back({st, ed});
                st = seg.first, ed = seg.second;
            }
            else ed = max(ed, seg.second);
        }
    
        if(st != -2e9) ret.push_back({st, ed});
    
        return ret;
    }
    int main(){
        cin >> n;
    
        for(int i = 0; i < n; ++i){
            int l, r;
            cin >> l >> r;
    
            segs.push_back({l, r});
        }
    
        auto ret = meger(segs);
    
        cout << ret.size() << endl;
    
        return 0;
    }
    
  • 相关阅读:
    BZOJ3064: Tyvj 1518 CPU监控
    BZOJ3160: 万径人踪灭
    BZOJ3527: [Zjoi2014]力
    BZOJ2194: 快速傅立叶之二
    FFT模板
    Splay树再学习
    POJ2406 Power Strings KMP算法
    POJ2752 Seek the Name,Seek the Fame KMP算法
    POJ3461 Oulipo KMP算法
    POJ2004 Mix and build Trie树? dp?
  • 原文地址:https://www.cnblogs.com/Lngstart/p/12274137.html
Copyright © 2011-2022 走看看