B. Buses 比较难的dp
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+10,MOD=1e9+7;
int dp[N],sum[N];//dp[i]表示上第i辆车的情况数,sum[i]表示上第i辆车之前的情况总数
int main(){
int n,m;
scanf("%d %d",&n,&m);
vector<pair<int,int> > road(m);
vector<int> v(m);
for(int i=0,s,t;i<m;i++){
scanf("%d %d",&s,&t);
road[i]=make_pair(t,s);
v[i]=t;
}
sort(road.begin(),road.end());//按终点排序
sort(v.begin(),v.end());//按下车地点排序
for(int i=0;i<m;i++){
int x=road[i].second,y=road[i].first;
if(x==0) dp[i]=1;
int start=lower_bound(v.begin(),v.end(),x)-v.begin();//上车路线起始
int end=lower_bound(v.begin(),v.end(),y)-v.begin();//上车路线结尾
dp[i]=(dp[i]+sum[end]-sum[start]+MOD)%MOD;
sum[i+1]=(sum[i]+dp[i])%MOD;
}
int ans=0;
for(int i=0;i<m;i++)
if(road[i].first==n)//这条路到终点
ans=(ans+dp[i])%MOD;
printf("%d\n",ans);
}