快速把 n 个有交集的区间合并,输出合并后的区间个数。
思路:
- 按区间左端点排序。
- 维护一个当前区间。遍历所有区间,动态更新当前区间左右端点的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <iostream> #include <algorithm> #include <vector> 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(st!=-2e9) { res.push_back({st,ed}); } st=seg.first; ed=seg.second; } else { ed=max(seg.second, ed); } } 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; }
|