Date:2022.03.16
题目描述
现给定 n 个闭区间 [ai, bi](1≤i≤n)。这些区间的并可以表示为一些不相交的闭区间的并。你的任务就是在这些表示方式中找出包含最少区间的方案。你的输出应该按照区间的升序排列。这里如果说两个区间 [a, b] 和 [c, d]是按照升序排列的,那么我们有a≤b<c≤d。
请写一个程序:
读入这些区间;
计算满足给定条件的不相交闭区间;
把这些区间按照升序输出。
输入格式
第一行包含一个整数 n(3≤n≤50000)为区间的数目。
以下 nn 行为对区间的描述,第 ii 行为对第 ii 个区间的描述,为两个整数 ai, bi(1≤ai<bi≤1000000),表示一个区间 [ai, bi]
输出格式
输出计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,为区间的上下界。你应该把区间按照升序排序。
输入输出样例
输入 #1复制
5
5 6
1 4
10 10
6 9
8 10
输出 #1复制
1 4
5 10
说明/提示
对于 100% 的数据,3≤n≤50000,1≤ai<bi≤1000000。
思路:区间合并。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e5+10;
int n,m,k;
typedef pair<int, int> PII;
vector<PII>segs;
void merge(vector<PII> &segs)
{
vector<PII>res;
int st=-2e9,ed=-2e9;
sort(segs.begin(),segs.end());
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()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;cin>>x>>y;
segs.push_back({x,y});
}
merge(segs);
for(auto seg:segs)
cout<<seg.first<<' '<<seg.second<<endl;
return 0;
}
275

被折叠的 条评论
为什么被折叠?



