题意:
要从0站坐车到n站
有m辆车 每辆车的起点为 si 站,终点为 ti 站
上车后只能在终点站下车,但可以在非终点站上车
求从0站到n站有几种乘车方案
将车按终点排个序
坐上第i辆车的方案数就是 [si,ti-1] 的乘车方案数,如果si=0则还要+1
就是求区间和的问题
要离散化
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int n,m,Rn,Rank[N];
int sum[N];
struct node{
int s,t;
}a[N];
bool cmp(node a,node b){
return a.t<b.t;
}
void setRank(){
int I = 1;
sort(Rank+1,Rank+1+Rn);
for(int i=2;i<=Rn;i++) if(Rank[i]!=Rank[i-1]) Rank[++I] = Rank[i];
Rn = I;
}
int getRank(int n){
return lower_bound(Rank+1, Rank+1+Rn, n) - Rank;
}
int low(int x){return x&-x;}
void add(int x,int val){
for( ; x<=Rn ; x += low(x)){
sum[x] = (sum[x] + val) % mod;
}
}
int Sum(int x){
int ans = 0;
for( ; x ; x -= low(x)){
ans = (ans + sum[x]) % mod;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&a[i].s,&a[i].t);
Rank[++Rn] = a[i].s; Rank[++Rn] = a[i].t;
}
Rank[++Rn] = n;
setRank();
sort(a,a+m,cmp);
for(int i=0;i<m;i++){
int ss = getRank(a[i].s);
int tt = getRank(a[i].t);
int p = Sum(tt-1) - Sum(ss-1);
if(a[i].s==0) p++;
add(tt, (p+mod)%mod);
}
int nn = getRank(n);
printf("%d\n",(Sum(nn) - Sum(nn-1) + mod) % mod);
return 0;
}