题目链接:Codeforces - Two Arrays
因为 b 是单调递增的,所以对于 b 的第 i 段来说,最后一个在 a 中的位置是已知的。
然后前面的元素可以随意划分,先对 a 求一个后缀 min ,那么如果当前某个后缀 min 等于 b 当中某个值,那么就是可以划分给前一个元素,所以当前第 i 段。
dp即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10,mod=998244353;
int n,m,a[N],b[N],dp[N]; map<int,int> mp;
inline void add(int &x,int y){x+=y; if(x>=mod) x-=mod;}
signed main(){
cin>>n>>m; dp[1]=1;
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(a[1]!=b[1]) return puts("0"),0;
for(int i=1;i<=n;i++) if(mp.count(a[i])){
int j=mp[a[i]]; add(dp[j],dp[j-1]);
}
cout<<dp[m];
return 0;
}