Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences

DP真的太难了啊!!
首先考虑到f(i,s)表示,从前i个数中选,最后一个数为ai,且MEX(a1,....,ai)={ai1(s=0)ai+1(s=1),因为有ai的存在,那么MEX只能取这两种值。
列出方程:

f(i,a[i]1)=j=1i1f(j,a[j]1)[aj==ai]+j=1i1f(j,a[j]+1)(aj==ai2)

f(i,a[i]+1)=j=1i1f(j,a[j]1)[aj==ai+2]+j=1i1f(j,aj+1)(aj==ai)

但是这样需要O(n2)复杂度。

而发现给定的ai值很小,因此可以直接把这个作为状态。

f(j,s)表示从前i个数中选,MEX(...ak)=j,且最后一个数为akak={j1(s=0)j+1(s=1)的方案数,那么当前x影响的只有f(x+1,s)f(x1,s)这两种方案,这样复杂度就降为了O(n2)

下面进行分类讨论:
1. 若MEX=x+1,最后一个数为x的方案。
1.1 前i1个数MEX=x+1,最后一个数为x的方案。
1.2 前i1个数MEX=x+1,最后一个数为x,再添加一个x的方案。
1.3 前i1个数MEX=x,最后一个数为x1,再添加一个x的方案。
那么方程如下:

f(x+1,0)=2f(x+1,0)+f(x,0)

2. 若MEX=x+1,最后一个数为x+2的方案。
2.1 前i1个数MEX=x+1,最后一个数为x+2的方案。
2.2 前i1个数MEX=x+1,最后一个数为x+2,再添加一个x的方案。
那么方程如下:

f(x+1,1)=2f(x+1,1)

3. 若MEX=x1,最后一个数为x的方案。
3.1 前i1个数MEX=x1,最后一个数为x的方案。
3.2 前i1个数MEX=x1,最后一个数为x,再添加一个x的方案。
3.3 前i1个数MEX=x1,最后一个数为x2,再添加一个x的方案。
那么方程如下:

f(x1,1)=2f(x1,1)+f(x1,0)

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
const int Mod = 998244353;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) {
        //memset(f, 0, sizeof f);
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        vector<vector<ll>> f(n + 2, vector<ll>(4, 0));
        f[0][0] = 1;
        //f[0][1] = ;
        for (int i = 0; i < n; i++) {
            int x = a[i];
            f[x + 1][0] = (f[x + 1][0] * 2 % Mod + f[x][0]) % Mod;
            f[x + 1][1] = f[x + 1][1] * 2 % Mod;
            
            if (x > 0) {
                f[x - 1][1] = (f[x - 1][1] * 2 % Mod + f[x - 1][0]) % Mod;
            }
        } 
        
        ll res = 0;
        for (int i = 0; i <= n; i++) {
            res = (res + f[i][0] + f[i][1]) % Mod;
        }

        cout << (res - 1 + Mod) % Mod << "\n";
    }

    return 0;
}
posted @   Xxaj5  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示