Educational Codeforces Round 118 D

D. MEX Sequences

对于一个数x 要是前面出现过0,1,2...x-1 我们显然可以将他放在后面
要是前面出现过0 1 2 ... x-1 x 我们也可以将他放在后面
但是观察样例 还有一种情况就是
0 1 2 ... x-2 我们可以把 x 放在后面 但是之后我们只能放x-2 和 x 了
我们将这两种序列分为两类 状态表示就是dp[i][0/1]当前mex为i 并且是第一种情况 还是第二种情况
要是第一种情况 我们的转移是: dp[i][0]+=dp[i][0]+dp[i-1][0](我们之前的x-1和x后面都可以加这个
要是第二种情况 dp[i][1]+=dp[i][1] 这个是这种情况 0 1 2 ... i-2 i的这种情况我们只能放在i后面
当然要是i>=2 我们这个i也可以直接来放在i-2的后头 if(i>=2)dp[i][1]+=dp[i-2][0]
最后就是我们已经是 0 1 2 .... x x+2 这种情况来了个x 我们刚刚说是可以放的
dp[i+2][1]+=dp[i][1]

void solve(){
    int n;cin>>n;
    int dp[n+10][2];
    memset(dp,0,sizeof dp);
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        int x;cin>>x;x++;
        (dp[x][0]+=dp[x][0]+dp[x-1][0])%=mod;
        (dp[x][1]+=dp[x][1])%=mod;
        (dp[x+2][1]+=dp[x+2][1])%=mod;
        if(x>1)(dp[x][1]+=dp[x-2][0])%=mod;
    }
    int ans=0;
    for(int i=1;i<=n+1;i++)(ans+=dp[i][0]+dp[i][1])%=mod;
    cout<<ans<<endl;
}
posted @ 2022-11-05 21:55  ycllz  阅读(16)  评论(0)    收藏  举报