题意
给出 n n n 条线段以及每条线段的左端点 l i l_{i} li 和右端点 r i r_{i} ri,求最少互不相交线段的数量
思路
考虑按右端点从小到大排序,每次记录一个 m a x r maxr maxr 表示目前选的线段中最大的右端点(因排完序,所以即最后一个的右端点),如果当前枚举到的 l i l_{i} li 大于等于 m a x r maxr maxr,也就代表又找到了一个不相交的线段,将其计入答案,再更新一下 m a x r maxr maxr。
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r;
bool operator<(const node &W)const{
return r<W.r;
}
}a[1000001];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&a[i].l,&a[i].r);
sort(a+1,a+n+1);
int ans=0,maxr=-0x3f;
for(int i=1;i<=n;i++)
if(maxr<=a[i].l)
{
ans++;
maxr=a[i].r;
}
printf("%d",ans);
return 0;
}