101B Buses
問題
バス停が0,1,2,...,nのn+1個ある。
0は自宅でnが目的地である。
m本のバスが走っている。
それぞれのバスはs[i]を出発してt[i]を終着駅とする。
バスは、s[i]からt[i]-1のどこからでも乗ることができるが、降りることができるのはt[i]のバス停のみである。
また、徒歩でバス停間を移動したり、目的地の逆向きにバスに乗ることはできない。
このとき、バスを使って目的地へ行く方法は何通りあるか、mod 10^9+7fで求めよ。
制約条件
n≦10^9
m≦10^5
s[i],t[i]≦n
方針
まずは座標圧縮する。すると考える必要のあるバス停は10^9から2*10^5個に減る。
次に終点の順にバスをソートする。
そうすると次のようなDPにより場合の数が求められる。
dp[i]=Σ[j=0〜i-1]dp[j]
ただし、和を求める部分は愚直にやるとTLEするので、binary indexed treeを使ってやる必要がある。
ソースコード
const int MX=222222, mod=(int)1e9+7; int bit[MX+1]; int sum(int i){ int s=0; while(i>0)(s+=bit[i])%=mod, i-=i&-i; return s; } void add(int i,int x){ while(i<=MX)(bit[i]+=x)%=mod, i+=i&-i; } int n,m,s[100000],t[100000],v[200002],k; pi p[100000]; void run(){ cin>>n>>m; k=0; rep(i,m){ cin>>s[i]>>t[i]; v[k++]=s[i]; v[k++]=t[i]; } v[k++]=0; v[k++]=n; sort(v,v+k); k=unique(v,v+k)-v; rep(i,k+3)bit[i]=0; rep(i,m){ p[i].first=lower_bound(v,v+k,t[i])-v+1; p[i].second=lower_bound(v,v+k,s[i])-v+1; } sort(p,p+m); add(1,1); rep(i,m)add(p[i].first,sum(p[i].first-1)-sum(p[i].second-1)); cout<<(sum(k)-sum(k-1)+mod)%mod<<endl; }