1442B.B. Identify the Operations(思维题。。。。)
发布日期:2021-06-30 10:24:51 浏览次数:2 分类:技术文章

本文共 1005 字,大约阅读时间需要 3 分钟。

a a a数组为 a 1   a 2   a 3   a 4   a 5 a_1\ a_2\ a_3\ a_4\ a_5 a1 a2 a3 a4 a5

设想现在需要添加 a 3 a_3 a3,那么可以删除 a 2 a_2 a2,也可以删除 a 4 a_4 a4

删除 a 2 a_2 a2后, a 3 a_3 a3代替 a 2 a_2 a2靠近了 a 1 a_1 a1

下次如果需要添加 a 1 a_1 a1,同样可以删掉 a 3 a_3 a3

对于数字 a 1 a_1 a1而言,情况并没有发生任何变化

同理即使删除 a 4 a_4 a4,对 a 5 a_5 a5也不会产生任何变化

所以一个数是否能删除之和是否出现在后续的 b b b数组中而已…

添加一个数有几种可能,不过取决于周围的两个数是否能删除而已

因为删除数字不会对后续和开始的情况有任何改变

#include 
using namespace std;typedef long long ll;const int mod = 998244353;const int maxn = 2e5+10; int t,n,k,a[maxn],b[maxn],pos[maxn],vis[maxn];int main(){
cin >> t; while( t-- ) {
cin >> n >> k; for(int i=1;i<=n;i++) cin >> a[i], vis[a[i]] = i; for(int i=1;i<=k;i++) cin >> b[i], pos[b[i]] = i; ll ans = 1; for(int i=1;i<=k;i++) {
ll cnt = 0; int r = a[vis[b[i]]+1];//后一个下标 int l = a[vis[b[i]]-1];//前一个下标 if( vis[b[i]]!=n&&pos[r]==0 ) cnt++; if( vis[b[i]]!=1&&pos[l]==0 ) cnt++; ans = ans*cnt%mod; pos[b[i]] = 0; } cout << ans << endl; for(int i=1;i<=n;i++) vis[i] = pos[i] = 0; }}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/110148655 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:CF 1437C. Chef Monocarp(简单费用流或dp)
下一篇:1442AA. Extreme Subtraction(贪心思维或差分)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月27日 00时28分43秒