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 給定乙個長度為...