2:区间并集
时间限制: 1 S | 内存限制: 65536 KB
Accept: 12 | Submit: 60
[提交] [讨论版]
描述
存在 n 个区间:a1、a2、…… 、an。
求 a1 ∪ a2 ∪ a3 ∪ …… ∪ an。
输入
只有一组案例。
第一行正整数 n 表示区间的个数。(1 <= n <= 1e5)
然后是 n 行,每行包含两个正整数 L 和 R,分别表示一个区间左右端点,即 [ L,R ]。(0 <= L <= R <= 1e10)
输出
根据左端点的大小,从小到大输出取并集后的每个区间。
每个区间的左端点和右端点之间用空格隔开,每次输出以后都要换行。
样例输入
6
1 2
1 4
8 10
8 9
5 6
6 7
样例输出
1 4
5 7
8 10
HINT
[1,2] 区间和 [1,4] 区间取并集后变为 [1,4]
[5,6] 区间和 [6,7] 区间取并集后变为 [5,7]
[8,9] 区间和 [8,10] 区间取并集后变为 [8,10]
来源
20-21(2)第0次线上赛
在这里#include <iostream>
#include<algorithm>
using namespace std;
//第0次竞赛 区间并集
typedef long long ll;
class Region
{
public:
ll a, b;
};
bool f(Region s, Region t)
{
if (s.a < t.a || t.a == s.a && s.b < t.b)
{
return true;
}
else
{
return false;
}
}
int main()
{
int n;
cin >> n;
Region* zhu = new Region[n];
for (int i = 0; i < n; i++)
{
cin >> zhu[i].a >> zhu[i].b;
}
sort(zhu, zhu + n, f);
cout << zhu[0].a << " ";
ll e = zhu[0].b;
for (int j = 1; j < n; j++)
{
if (zhu[j].a > e)
{
cout << e << endl;
cout << zhu[j].a << " ";
e = zhu[j].b;
}
else
{
e = max(e,zhu[j].b);
}
}
cout << e << endl;
}插入代码片