[题目描述]
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和[2,6]可以合并为一个区间[1,6]。
[输入格式]
第一行包含整数n。
接下来n行,每行包含两个整数 l 和 r。
[输出格式]
共一行,包含一个整数,表示合并区间完成后的区间个数。
[数据范围]
1≤n≤100000
−109≤li≤ri≤109
[输入样例]:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
[输出样例]:
8
0
5
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r;
bool operator < (const node&jj )const
{
return jj.l>l;
}
};
node jj[100005];
int n;
int main()
{
scanf("%d",&n);
int num=1;
for(int j=1;j<=n;++j) scanf("%d%d",&jj[j].l,&jj[j].r);
sort(jj+1,jj+n+1);
int k=jj[1].r;
for(int i=2;i<=n;i++)
{
if(k>=jj[i].l)
{
if(k<=jj[i].r)k=jj[i].r;
}
else
{
num++;
k=jj[i].r;
}
}
printf("%d",num);
return 0;
}
相关练习:一本通1323活动选择
#include<iostream>
using namespace std;
int n,be[1005],en[1005];
void qs(int x,int y)
{
int i,j,midd,t;
i=x; j=y;
midd=en[(x+y)/2];
while(i<=j)
{
while(en[i]<midd)i++;
while(en[j]>midd)j--;
if(i<=j)
{
swap(en[i],en[j]);
swap(be[i],be[j]);
i++;j--;
}
}
if(x<j)qs(x,j);
if(i<y)qs(i,y);
}
void so()
{
int ans=0;
for(int i=1,t=-1;i<=n;i++)
if(be[i]>=t)
{
ans++;
t=en[i];
}
cout<<ans;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>be[i]>>en[i];
qs(1,n);
so();
return 0;
}