题目链接:https://codeforces.ml/contest/1366/problem/E
题目大意:有一个长为n的a数组,和长为m的b数组。问有多少种方案把a数组分成m块。第i块的最小值对应b[i],b数组保证递增。
图片说明
思路:用dp[i]:组成b数组前i个数的方案数。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int mod=998244353;
int a[200005], b[200005], f[200005];
map<int, int> mp;
int main() {

    int n, m; scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
    }
    for(int i=1; i<=m; i++){
        scanf("%d", &b[i]);
        mp[b[i]]=i;
    }
    for(int i=n-1; i>=1; i--){
        a[i]=min(a[i], a[i+1]);
    }
    if(b[1]!=a[1]){
        printf("0\n", f[m]);
        return 0;
    }
    f[1]=1;
    for(int i=1; i<=n; i++){
        if(!mp[a[i]]||mp[a[i]]==1) continue;
        int pos=mp[a[i]];
        f[pos]=(f[pos]+f[pos-1])%mod;
    }
    printf("%d\n", f[m]);

    return 0;
}