链接
分析:初始的线段都是从小到大且连串的,如果两个点有交集只需要一刀断
多个区间,需要两刀的情况
这种情况,一刀断就可以;
取决于你的区间,如果都交集于1个区间,那么就可以一刀断,所以每次遍历一个区间的时候,看左半部分是否在未切区间的交集里即可
还有一个坑就是 给你区间范围的时候不都是左边小右边大的!!!!!
AC代码:
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
}e[100010];
int cmp(node x,node y)
{
if(x.x==y.x)
return x.y<y.y;
return x.x<y.x;
}
int main()
{
int n,m,ans,l,r;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
e[i].x=min(a,b);//!!!未必左小右大!!!!
e[i].y=max(a,b);
}
sort(e+1,e+1+m,cmp);
ans=1;
l=e[1].x;
r=e[1].y;
for(int i=2;i<=m;i++)
{
if(e[i].x==l)//左边界一样
{
r=min(r,e[i].y);
continue;
}
else if(e[i].x<r)//在一个区间 只更新区间即可!!!
{
l=max(l,e[i].x);
r=min(r,e[i].y);
continue;
}
else//不在一区间 那么之前的用一次机会,更新新的区间
{
ans++;
l=e[i].x;
r=e[i].y;
}
}
cout<<ans<<endl;
}