算法基础课:区间合并


区间合并

可能出现的情况

image-20220524102841888

例题

image-20220524102928323

算法

  • 定义一对st、ed记录当前区间的下标
  • 需要对输入的区间对,按照first进行排序
  • 遍历存储的区间对segs,比较ed 与 seg.first,根据三种不同的情况更新st 和 ed

C++实现

#include
#include
#include
using namespace std;

typedef pair PII;

vector segs;

int n;

void merge_segs (vector &segs) {
    vector res;
    
    sort (segs.begin(), segs.end());    // pair按照first排序
    
    int st = -2e9, ed = -2e9;
    for (PII 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;
    
    while (n --) {
        int l, r;
        cin >> l >> r;
        segs.push_back({l, r});
    }
    
    merge_segs(segs);
    
    cout << segs.size();
    
    return 0;
}