区间和并
基本思想:
给定多个区间,快速取出多个区间的并集
实现方式:
- 按区间左端点排序
- 动态维护区间,会出现三种情况:
对于第一种情况:维持原来的起始点st和结束点ed即可
对于第二种情况:将尾节点更新成 2 区间的尾节点
对于第三种情况:将维护的此区间存入答案,将 3 区间作为新的动态维护空间
例题:
Acwing803 - 区间合并
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| typedef pair<int, int> P;
const int N = 100000;
int n; vector<P> segs;
void merge (vector<P> &segs) { vector<P> ans; sort(segs.begin(), segs.end()); int st = -2e9, ed = -2e9; for (auto seg : segs) { if (ed < seg.first) { if (st != -2e9) ans.push_back({st, ed}); st = seg.first; ed = seg.second; } else ed = max(ed, seg.second); } if (st != -2e9) ans.push_back({st, ed}); segs = ans; }
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; }
|