Codeforces Beta Round #79 (Div. 1 Only), problem: (B) Buses 路径DP

题意:某个人要从1站乘车到n站,图中可以搭乘公交车,而且一旦上车,中途无法下车

做法:路径DP,可是一时疏忽啊。。。。要DP每个点才行

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define mod 1000000007
#define LL long long
const int LMT=100003;
using namespace std;
struct stop
{
    int s,t,sx,tx;
    bool operator<(const stop &val)const
    {
       if(t!=val.t)
        return t<val.t;
        return s<val.s;
    }
}st[LMT];
LL dp[LMT<<1],sum[LMT<<1];
int n,m,cnt,X[LMT<<1];
int myfind(int x)
{
    int m,l=0,r=cnt-1;
    while(l<=r)
    {
        m=(l+r)>>1;
        if(X[m]==x)return m;
        if(x<X[m])r=m-1;
        else l=m+1;
    }
    return -1;
}
int main()
{
    int t;
    scanf("%d%d",&n,&m);
    X[cnt++]=-1;
    X[cnt++]=0;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&st[i].s,&st[i].t);
        X[cnt++]=st[i].s;
        X[cnt++]=st[i].t;
    }
    X[cnt++]=n;
    t=1;
    sort(X,X+cnt);
    for(int i=1;i<cnt;i++)
    if(X[i-1]!=X[i])X[t++]=X[i];
    cnt=t;
    sort(st,st+m);
    for(int i=0;i<m;i++)
    {
        st[i].sx=myfind(st[i].s);
        st[i].tx=myfind(st[i].t);
    }
    sum[1]=1;
    for(int i=2,j=0;i<cnt;i++)
    {
        while(j<m&&st[j].tx==i)
        {
            dp[i]+=(sum[i-1]-sum[st[j].sx-1])%mod;
            dp[i]%=mod;
            j++;
        }
        sum[i]+=sum[i-1]+dp[i];
        sum[i]%=mod;
    }
    if(dp[cnt-1]<0)dp[cnt-1]+=mod;
    cout<<dp[cnt-1]%mod<<endl;
    return 0;
}


你可能感兴趣的:(Codeforces Beta Round #79 (Div. 1 Only), problem: (B) Buses 路径DP)