区间合并算法总结

发布时间 2023-12-02 00:23:38作者: ykycode

区间合并使用贪心算法,对于区间问题,通常需要对左端点排序、右端点排序或者左端点和右端点双关键字排序。区间合并算法的算法步骤:

1. 按照区间左端点排序。

2. 扫描过程中,每次维护一个当前的区间。

题目链接:

https://www.acwing.com/problem/content/805/

代码:

#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
typedef pair<int, int> PII;
 
int n;
vector<PII> segs;
 
void merge(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});
    }
    
    merge(segs);
    
    cout << segs.size() << endl;
    
    return 0;
}