演算法(區間合併)

2021-10-09 07:11:49 字數 1111 閱讀 2159

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

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

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

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

輸入格式

第一行包含整數n。

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

輸出格式

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

資料範圍

1≤n≤100000,

−10^9 ≤l≤r≤ 10^9

輸入樣例:

51 2

2 45 6

7 87 9

輸出樣例:

3

#include

#include

#include

using

namespace std;

const

int n=

100010

;typedef pair<

int,

int>pii;

vectorsegs;

void

merge

(vector

&segs));

st=m.first;

ed=m.second;

}//兩者有交集,可以合併,且區間1不包含區間2,區間2不包含區間1

else ed=

max(ed,m.second)

;//重新規定範圍

//(實際上也有情況3:區間1包含區間2,此時不需要任何操作,可以省略)

//注:排過序之後,不可能有區間2包含區間1

}//還剩下最後乙個序列,但沒有放進res陣列,因為它是序列中的最後乙個序列,迴圈中沒有放進去

if(st!=

-2e9

)res.

push_back()

;//避免區間是空的

segs=res;

//把segs更新為res區間

}int

main()

);}merge

(segs)

; cout

}

區間合併演算法

問題 對輸入的區間如 1,2 2,6 3,5 7,9 進行合併,輸出 1,6 7,9 思路1 如果資料較小,可開闢一大陣列,如上述資料,開闢乙個大小為100的布林型陣列對在區間內的賦值true。掃瞄輸出為true的數字。思路2 定義left和right,1 開始left和right分別為第乙個區間的...

區間合併演算法

兩個區間的關係無非就下面幾種 這裡說的左端點是指下面那個區間的左右端點,內外指的是下面區間相較於上面區間的位置關係 左端點 1.區間內 2.區間外 右端點 1.區間內 2.區間外 左1右1,左1右2,左2右1,左2右2 左2右1這種情況是不可能的,所以一共就3種可能的關係 1.2.3.針對3種不同的...

演算法之合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。思路 先進行...