區間合併
阿新 • • 發佈:2020-07-18
給定nn個區間[li,ri][li,ri],要求合併所有有交集的區間。
注意如果在端點處相交,也算有交集。
輸出合併完成後的區間個數。
例如:[1,3]和[2,6]可以合併為一個區間[1,6]。
輸入格式
第一行包含整數n。
接下來n行,每行包含兩個整數 l 和 r。
輸出格式
共一行,包含一個整數,表示合併區間完成後的區間個數。
資料範圍
1≤n≤1000001≤n≤100000,
−109≤li≤ri≤109−109≤li≤ri≤109
輸入樣例:
5
1 2
2 4
5 6
7 8
7 9
輸出樣例:
3
這個就很簡單了,分為兩種情況:
1。區間有交集
2。區間沒有交集
用pair來存放l與r。
程式碼
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 5 using namespace std; 6 7 typedef pair<int, int> PII; 8 9 const int N = 100010; 10 int n; 11 vector<PII> segs; 12 13 void merges(vector<PII> &segs)14 { 15 vector<PII> res; 16 17 sort(segs.begin(), segs.end()); 18 19 int st = -2e9, ed = -2e9; 20 for(auto seg : segs) 21 { 22 if(ed < seg.first) //沒有交集 23 { 24 if(st != -2e9) res.push_back({st, ed}); //防止出現一個集合都沒有的情況 25 st = seg.first, ed = seg.second;26 } 27 else ed = max(ed, seg.second); //有交集 28 } 29 30 if(st != -2e9) res.push_back({st, ed}); //把最後一個區間放進去 也是防止一個區間都沒有的情況 31 32 segs = res; 33 } 34 35 int main() 36 { 37 cin >> n; 38 for(int i = 0; i < n; i++) 39 { 40 int l, r; 41 cin >> l >> r; 42 segs.push_back({l, r}); 43 } 44 45 merges(segs); 46 47 cout << segs.size(); 48 49 system("pause"); 50 return 0; 51 }