原题:
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。
输入格式
第一行包含整数 n。
接下来 n行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤100000,
−109≤li≤ri≤109输入样例:
5 1 2 2 4 5 6 7 8 7 9
输出样例:
3
代码(模板题里自己AC的第一道):
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct Range
{
int l,r;
bool operator < (const Range &w) const
{
return l<w.l;//如果换成对右端点排序则答案错误,为什么???
}
}range[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int l,r;
cin>>range[i].l>>range[i].r;
}
sort(range,range+n);
int cnt=0,ed=-2e9;
for(int i=0;i<n;i++)
{
if(range[i].l>ed)
{
cnt++;
}
ed=max(range[i].r,ed);//要放在if语句外面,因为每次都要更新右端点,取最大值,这样才可以包含更多的区间。举例:(-23,8)(-20,23)(11,27)如果这条语句放在if里面输出的答案是2,放外面答案是1
}
cout<<cnt;
return 0;
}