小白月赛 F

小杜跑酷

题链
DP肯定的
发现m只有5e5
我们该点要是跳板只会最多影响后面两列以及自己这一列的状态
所以状态最多就是3*m个
其他状态都是不变的

int dp[4][N*3];
bool mp[4][N*3];
void solve(){
    int n,m;cin>>n>>m;
    vector<pair<int,int>>a(m+1);
    for(int i=1;i<=m;i++){
        cin>>a[i].second>>a[i].first;
    }
    sort(all(a));
    vector<int>step(m+1);
    for(int i=1;i<=m;i++){
        int now=a[i].first-a[i-1].first;
        step[i]=step[i-1]+min(3ll,now);
        mp[a[i].second][step[i]]=true;
    }
    dp[1][1]=1;
    n=step[m]+1;
    for(int j=1;j<n;j++){
        for(int i=1;i<=3;i++){
            if(mp[i][j]){
                (dp[max(1ll,i-1)][min(n,j+1)]+=dp[i][j])%=mod;
                (dp[i][min(n,j+2)]+=dp[i][j])%=mod;
                (dp[min(3ll,i+1)][min(n,j+1)]+=dp[i][j])%=mod;
            }else{
                (dp[i][min(n,j+1)]+=dp[i][j])%=mod;
            }
        }
    }
    cout<<dp[1][n]<<endl;
    cout<<dp[2][n]<<endl;
    cout<<dp[3][n]<<endl;
}
posted @ 2022-12-31 18:13  ycllz  阅读(10)  评论(0)    收藏  举报