一、题目

题目链接:https://www.acwing.com/problem/content/805/

给定 nn 个区间 [li,ri][l_i, r_i],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3][1,3][2,6][2,6] 可以合并为一个区间 [1,6][1,6]

输入格式

第一行包含整数 nn

接下来 nn 行,每行包含两个整数 llrr

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1n1000001 \le n \le 100000,
109liri109-10^9 \le l_i \le r_i \le 10^9

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

二、题解

1. 区间合并

2. vector<PII>排序

三、代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;

int n;
vector<PII> qj;

void merge(vector<PII> &qqj)
{
vector<PII> ans;
sort(qqj.begin(), qqj.end());
int st = -2e9, ed = -2e9;
for (auto it : qqj)
{
if (it.first > ed)
{
if (st != -2e9) ans.push_back({st, ed});
st = it.first, ed = it.second;
}
else ed = max(ed, it.second);
}
if (st != -2e9) ans.push_back({st, ed});
qqj = ans;
}

int main()
{
cin >> n;
while ( n -- )
{
int l, r;
cin >> l >> r;
qj.push_back({l, r});
}
merge(qj);
cout << qj.size() << endl;
return 0;
}