小杜跑酷
题链
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;
}
标签:状态,小杜跑,int,second,小白月赛,5e5
From: https://www.cnblogs.com/ycllz/p/17017079.html