1. 程式人生 > 實用技巧 >區間合併

區間合併

給定nn個區間[li,ri][li,ri],要求合併所有有交集的區間。

注意如果在端點處相交,也算有交集。

輸出合併完成後的區間個數。

例如:[1,3]和[2,6]可以合併為一個區間[1,6]。

輸入格式

第一行包含整數n。

接下來n行,每行包含兩個整數 l 和 r。

輸出格式

共一行,包含一個整數,表示合併區間完成後的區間個數。

資料範圍

1n1000001≤n≤100000,
109liri109−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 }