
点击查看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, int> PII;
vector<PII> segs;
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;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++) {
int l, r;
scanf("%d %d", &l, &r);
segs.push_back({l, r});
}
merge(segs);
printf("%d", segs.size());
return 0;
}
- 将区间按照左端点进行排序,如果左端点相同,按右端点排序(sort 对 pai 排序的规则是,先按照第一个成员,再按照第二个成员);
- 区间合并的三种情况:
① 新区间是原区间的子区间,新区间的右端点小于原区间右端点,这种情况不需要处理;
② 新区间和原区间有交集,需要合并,新区间的右端点大于原区间的右端点,需要把原区间右端点更新为新区间右端点;
③ 新区间和原区间没有交集,需要把区间更新,新区间左端点大于原区间右端点(这种情况要先判断,再判断①和②),将原区间存到 res 中,将原区间更新为新区间;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!