一、概述
区间和并就是将有交集的区间合并为并区间。
二、思路
- 按区间的左端点进行排序
- 判断第一个区间的右端点是否小于第二个区间的左端点。(是,则无交集,反之则有。)
三、模板
int main(void)
{
vector<pair<long long, long long>> segs;//用一个二元组来存放左右端点
for (int i = 0; i < 2; i++)
{
long long st, ed;
scanf("%lld%lld", &st, &ed);
segs.push_back({ st,ed });//将每一个区间的端点存入vector中
}
sort(segs.begin(), segs.end());//对区间进行排序,确保第一个区间的左端点是最小的
if (segs[0].second < segs[1].first) cout << "No" << endl;//合并区间
else cout << "Yes" << endl;
return 0;
}
例题:区间和并---模板
// 将所有存在交集的区间合并
void merge(vector<PII> &segs)
{
vector<PII> res;
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9;
for (auto seg : segs)
if (ed < seg.first)
{
if (st != -2e9) res.push_back({st, ed});
st = seg.first, ed = seg.second;
}
else ed = max(ed, seg.second);
if (st != -2e9) res.push_back({st, ed});
segs = res;
}