在坐标轴上有 nn 条线段,每条线段的左端点为 a_iai,右端点为 b_ibi。现在你需要删去部分线段,使得剩下的线段除端点外无公共部分。请你计算最多能保留的线段数目。
输入格式
第一行一个整数 n\ (1\le n\le 10^6)n (1≤n≤106),表示线段的条数。
接下来 nn 行,每行两个整数 a_i,b_i\ (0 \le a_i < b_i \le 10^6)ai,bi (0≤ai<bi≤106)
输出格式
一个整数,表示最多能保留的线段数。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
struct Line{
int a,b;
}line[1000100];
void ShellSort(struct Line R[],int n){
int i,j,d;
struct Line tmp;
d=n/2;
while(d>0){
for(i=d;i<n;i++){
tmp=R[i];
j=i-d;
while(j>=0&&tmp.b<R[j].b){
R[j+d]=R[j];
j=j-d;
}
R[j+d]=tmp;
}
d=d/2;
}
}
int main(){
int n;
int i,j=0;
int p[1000100]={0};
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d %d",&line[i].a,&line[i].b);
}
ShellSort(line,n);
int cnt=1;
struct Line tmp=line[0];
for(i=1;i<n;i++){
if(line[i].a>=tmp.b){
p[i]=1;
cnt++;
if(tmp.b<line[i].b) tmp=line[i];
}
}
printf("%d ",cnt);
return 0;
}