【CF1443F】Identify the Operations 题解
题意简介
建议去原题看。这题意我表达不清楚。
大概就是给你一个 n 的排列,现在要求你进行 m 次操作。
每次操作,你会在现有的排列中删去一个数,然后选择其左边或右边的一个与之相邻的数加入 b 数组中。
然后将变成两截的数组重新连在一起,更新下标。
现在问有多少种操作方案,可以使 b 数组中恰好按顺序排列着它给定的那几个数字。
只要两个方案中任一轮删数的下标不同,就视为不同的方案。
思路分析
这道题显然是道水题。不明白为什么扔在 F。或许出题人是用脚编排题目。
其实这道题是同场 div1 的 B 题,之前写的 CF1443 D 则是 div1 的 A 题。
感觉E题更难一点。
由数字不会重复这一点上看,想要加入一个数字,就需要删去其中一个与之相邻的数字。
如果某个数字两端都是需要在其之后加入的数字,那么显然无解。
另外,在删数过后,后面的数字的下标会往前推一格。判断方案不同的依据就是被删除的下标的顺序。
如果某个数字原本另一边就有一个需要保留的数字,那么前面的所有操作都不可能改变这一点。
而如果数字的两边都可以删除,那么前面的操作依然不可能改变这一点。
每次操作实质上改变的有且只有下标和加入顺序都在它之后的数字的操作对应的 ti 。
在保证不会删掉还没加入 b 的需要的数字的前提下,记每个需要的数字可以删去的与之相邻的数的个数 c 。
不难发现答案应该是: \(\prod_{i=1}^m c_i\)
代码库
说起来这是我第一次在 memset 上吃瘪。
里头有一组数据 t=1e5 里头全是 n=2 m=1
然后我就 TLE 了。
这个故事告诉我们 t 比较大时 memset 不要乱用。
或者试一下 memset(p,0,(n+1)*sizeof(int)) 。
#include <cstdio>
#include <cstring>
typedef long long ll;
#define REG register
#define rep(i,a,b) for(REG int i=a;i<=b;i++)
const ll N=2e5+5,mod=998244353;
int n,m,A[N],B[N],p[N]; ll ans; bool vis[N];
int main(){
REG int t; scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
//memset(p,0,sizeof(p));
//memset(vis,0,sizeof(vis));
rep(i,1,n) p[i]=vis[i]=0;
rep(i,1,n) scanf("%d",A+i),p[A[i]]=i;
rep(i,1,m) scanf("%d",B+i),vis[B[i]]=1;
ans=1;
rep(i,1,m){
REG int pos=p[B[i]],c=0;
if(pos-1>=1&&!vis[A[pos-1]]) c++;
if(pos+1<=n&&!vis[A[pos+1]]) c++;
ans=ans*c%mod; vis[B[i]]=0;
}
printf("%lld\n",ans);
}
return 0;
}
【CF1443F】Identify the Operations 题解的更多相关文章
- codechef Row and Column Operations 题解
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020 - Final) B. Identify the Operations (模拟,双向链表)
题意:给你一组不重复的序列\(a\),每次可以选择一个数删除它左边或右边的一个数,并将选择的数append到数组\(b\)中,现在给你数组\(b\),问有多少种方案数得到\(b\). 题解:我们可以记 ...
- Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)【ABCDF】
比赛链接:https://codeforces.com/contest/1443 A. Kids Seating 题意 构造一个大小为 \(n\) 的数组使得任意两个数既不互质也不相互整除,要求所有数 ...
- Leetcode-283 Move Zeroes
#283. Move Zeroes Given an array nums, write a function to move all 0's to the end of it while mai ...
- Cheatsheet: 2013 10.09 ~ 10.23
Other 10 Basic Linux Networking and Monitoring Commands You Should Know A simple, portable yet effic ...
- 6.4 操作契约 Operation Contracts
4.操作契约 Operation Contracts “用例描述”的补充 强调: 用例中重要的动作,其开始与结束是需要一些约束 4.5 操作契约的后置条件 定义Definition 后 ...
- Oracle ASM 相关的 视图(V$) 和 数据字典(X$)
本文转自: http://blog.csdn.net/tianlesoftware/article/details/6733039 ASM由于其高度的封装性,使得我们很难知道窥探其内部的原理.可以通过 ...
- Snoop resynchronization mechanism to preserve read ordering
A processor employing a post-cache (LS2) buffer. Loads are stored into the LS2buffer after probing t ...
- UML期末绘图及细节总结
往届期末绘图的题目例如以下所看到的: Read the providing materials carefully, and then do tasks. 2.1: Use Case Diagram ...
随机推荐
- Python练习题 011:成绩打分
[Python练习题 011] 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. ---------------------- ...
- 在sqlserver中创建表
1:在sql语句中,临时表有两类,分别是局部(local)和全局(global)临时表,局部临时表只在其会话(事务)中可见,全局临时表可以被会话(事务)中的任何程序或者 模块访问 2:创建局部临时表 ...
- P4915 帕秋莉的魔导书(动态开点线段树)
题目背景 帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书. 题目描述 魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙.因此,每本魔导书都有它自 ...
- pycharm 解决PEP8问题,配置autopep8到菜单栏
autopep8是一个可以将Python代码自动排版为PEP8风格第三方包,使用它可以轻松地排版出格式优美整齐的代码.网络上有很多介绍如何在pycharm中配置autopep8的方案,但很多方案中还是 ...
- 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业
结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...
- SHOI 2013 【扇形面积并】
早上考的,我打了80分的部分分,出来和同学讨论的时候真想扇自己一巴掌...... 题目描述: 给定 n 个同心的扇形,求有多少面积,被至少k 个扇形所覆盖. 输入输出格式 输入格式: 第一行是三个整数 ...
- Hello World背后的事情
Hello World是不少人学习C++的第一项内容,代码看似简单,很多东西却涉及根本 #include <iostream> using namespace std; int main( ...
- 发布TrajStat 1.4.4
发布TrajStat 1.4.4 (MeteoInfo Java版插件),在PSCF和CWT源区分析中增加了依据格点中的气团轨迹条数为权重进行结果处理的功能.之前的仅有按照轨迹节点数目进行权重处理的功 ...
- 算出cron表达式接下来几次执行时间
目录 1.使用cron库 2.总结 1.使用cron库 需要使用的go库:[点击跳转]. 具体使用方法可以参照例子使用,下面主要实现计算接下来几次cron表达式执行时间. package main i ...
- Token 、Cookie和Session的区别
本文转至http://blog.csdn.net/tobetheender/article/details/52485948 https://blog.csdn.net/axin66ok/articl ...