基礎演算法 區間和並

2021-10-08 06:12:02 字數 1530 閱讀 6286

1. 區間和並

把有交集的區間合成乙個大的區間

2. 算發步驟

1)把要合併的區間按區間左端點從小到大排序

2)用st和ed指標從前往後維護區間

3)比較ed 和後乙個區間的左端點,分情況更新ed和first

3. 模板

// 將所有存在交集的區間合併

void

merge

(vector

&segs));

st = seg.first, ed = seg.second;

}else ed =

max(ed, seg.second);if

(st !=

-2e9

) res.

push_back()

; segs = res;

}

4. 例題

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

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

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

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

輸入格式

第一行包含整數n。

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

輸出格式

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

資料範圍

1≤n≤100000,−109≤li≤ri≤109

輸入樣例:

51 2

2 45 6

7 87 9

輸出樣例:

3

#include

#include

#include

using

namespace std;

const

int n =

100010

;typedef pair<

int,

int> pii;

int n;

vector segs;

//儲存所有區間

void

merge

(vector

& segs));

st = seg.first, ed = seg.second;

}else ed =

max(ed, seg.second);}

if(st !=

-2e9

) res.

push_back()

; segs = res;

}int

main()

);}merge

(segs)

; cout << segs.

size()

<< endl;

return0;

}

基礎演算法 區間合併

概念 給我們很多區間,如果有交集的區間 如果在端點處相交也算 我們可以將他們合併城乙個區間。1 按區間左端點從小到大排序。2 總共有三種情況 給定 nn 個區間 li,ri li,ri 要求合併所有有交集的區間。注意如果在端點處相交,也算有交集。輸出合併完成後的區間個數。例如 1,3 和 2,6 可...

演算法 求區間並集的長度

給定數軸上的一些區間,求區間並集的長度。只需要用乙個cover來記錄當前區間覆蓋的層數。從左到右遇到乙個點就判斷 每作過一次區間左端點,cover就加1,每作過一次區間右端點,cover就減1,顯然cover只有正整數和0兩種狀態,為正數時就將臨近兩個點所指代的小區間長度加進來。求區間並集長度 de...

演算法 k倍區間(字首和)

利用字首和可以快速計算出乙個區間的值,然後利用字首和的取餘相同時,相減之後就會等於0,說明如果有k個具有相同餘數的區間的話,就能有 k 1 k 2 1個區間滿足的情況。cnt 0 是因為如果s i 取餘的值為0時,就相當於從總區間的左端點到i的區間滿足情況,所以應該提前加上cnt 0 給定乙個長度為...