803 區間合併

2022-07-22 13:03:13 字數 1510 閱讀 6262

給定 n 個區間 \(l_i,r_i\),要求合併所有有交集的區間。

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

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

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

輸入格式

第一行包含整數n。

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

輸出格式

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

資料範圍

\(1≤n≤100000,\)

\(−10^9≤l_i≤r_i≤10^9\)

兩種方法,都是先按照區間左端點排序,然後從左到右去看當前區間和下乙個區間之間的包含關係來確定是更新當前區間還是合併成新的區間

複雜度:\(o(nlogn + n) = o(nlogn)\)

模板1

#include#include#includeusing namespace std;

#define pii pairint n;

vectorsegs;

int main());

}sort(segs.begin(), segs.end());

int st = -2e9, ed = -2e9;

vectorres;

for(auto seg : segs)

if(ed < seg.first));

st = seg.first;

ed = seg.second;

}else ed = max(ed, seg.second);

if(st != -2e9) res.push_back();

cout << res.size() << endl;

return 0;

}

模板2

#include#include#includeusing namespace std;

#define pii pairint n;

vectorsegs;

int main());

}sort(segs.begin(), segs.end());

int cnt = 1;

for(int i = 1, j = 0; i < segs.size(); i ++)

if(segs[j].second >= segs[i].first)

segs[j].second = max(segs[j].second, segs[i].second);

else

cout << min(cnt, segs.size()) << endl; // 此處為了防止segs為空

return 0;

}

模板題:校門外的樹

AcWing 803 區間合併

給定 n 個區間 li,ri 要求合併所有有交集的區間。注意如果在端點處相交,也算有交集。輸出合併完成後的區間個數。例如 1,3 和 2,6 可以合併為乙個區間 1,6 第一行包含整數n。接下來n行,每行包含兩個整數 l 和 r。共一行,包含乙個整數,表示合併區間完成後的區間個數。1 n 10000...

AcWing 803 區間合併 C

注意如果在端點處相交,也算有交集。輸出合併完成後的區間個數。例如 1,3 和 2,6 可以合併為乙個區間 1,6 輸入格式 第一行包含整數n。接下來n行,每行包含兩個整數 l 和 r。輸出格式 共一行,包含乙個整數,表示合併區間完成後的區間個數。資料範圍 1 n 100000,109 li ri 1...

7620 區間合併

7620 區間合併 總時間限制 1000ms 記憶體限制 65536kb 描述 給定 n 個閉區間 ai bi 其中i 1,2,n。任意兩個相鄰或相交的閉區間可以合併為乙個閉區間。例如,1 2 和 2 3 可以合併為 1 3 1 3 和 2 4 可以合併為 1 4 但是 1 2 和 3 4 不可以合...