区间合并
概念:在有序升序序列中,如果某一区间合另一区间存在交集,则两个区间可以合并为一个区间
思考情况:
1.绿色区间在蓝色区间内部 2.橙色区间与蓝色区间有交集 3.粉色区间与蓝色区间无关联
|
最终得到新的合并区间[ st , ed ]
st全称start,ed全称end
例题
题目描述 给定 n 个区间 [li , ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。
输入格式 第一行包含整数 n。 接下来 n 行,每行包含两个整数 l 和 r。
输出格式 共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围 1 ≤ n ≤ 100000 , −1e9 ≤ li ≤ ri ≤ 1e9
|
输入样例
输出样例
题解
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream> #include <vector> #include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
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 (ed != -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; }
|