区间合并
主要内容
快速地将一系列区间中有交集(包括端点相交)的区间合并成一个,返回处理后的区间列表。

代码模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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(ed!=-2e9) res.push_back({st,ed});
segs=res; }
|
例题
Acwing区间合并_acwing 区间合并-CSDN博客
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 52 53 54 55 56 57 58 59 60
|
#include<bits/stdc++.h> using namespace std;
const int N=1e5+5; typedef pair<int,int> PII; vector<PII> segs; int n;
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(ed!=-2e9) res.push_back({st,ed});
segs=res; }
void work(){ 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; }
int main(){ work(); return 0; }
|