P13788 「CZOI-R6」Permutation and Subsequence

P13788 「CZOI-R6」Permutation and Subsequence

思路

因为我们要求的东西在 \(a\) 中是连续的,所以我们可以考虑将答案直接从在 \(a\) 中的前一个数更新过来,这样就保证这个方案一定在 \(a\) 中是连续的。然后我们令数组 \(id_i\) 表示其在 \(a\) 中的位置,随后顺序遍历 \(b\) 初始化 \(dp_i = 1\) (单独的一个数字肯定既是 \(a\) 的字串又是 \(b\) 的子序列),同时 \(dp_{b_i} \gets dp_{b_i}+dp_{a_{id_{b_i}}-1}\),也就是加上其在 \(a\) 中前一个数的答案,这样就做完了。这是正确的,因为如果前一个没有值,那么说明在 \(b\) 中他们不是子序列,也就不能取其余以它为结尾的在 \(a\) 中的字串。

代码

#include <bits/stdc++.h>
using namespace std;
#define freop(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define int long long
#define double long double
#define re register
#define endl '\n'
#define inf 0x7f7f7f7f7f7f7f7f
#define lb(x) (x&-x)
#define pii pair<int,int>
#define fir first
#define sec second
#define umap unordered_map
#define uset unordered_set
const int N=1e6+1;
int n,a[N],id[N],dp[N],ans;//如上文所说,b在循环中

signed main(){
	cin.tie(0)->ios::sync_with_stdio(false);
	cout.tie(0);
//	freop();
//↑以上为初始化↑
//------------------------------
	cin >> n;
	for(int i = 1;i<=n;++i) cin >> a[i],id[a[i]]=i;
	for(int i = 1,b;i<=n;++i){
		cin >> b,dp[b]=1;
		dp[b]+=dp[a[id[b]-1]];更新dp数组
		ans+=dp[b];//统计答案
	}
	cout << ans << endl;
	return 0;
}
posted @ 2026-10-21 21:20  elon_giao  阅读(4)  评论(0)    收藏  举报