Codeforces - Two Arrays

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/107759433