中山市网站开发公司,做淘宝客如何建自己的网站,wordpress编辑器文件,视频网站备案*给定一个输入受限的双端队列#xff08;即一个端点允许插入和删除#xff0c;另一个端点只允许删除的双端队列#xff09;和一个长度为 N 的插入序列。插入序列中的元素两两不同。你需要将插入序列中的元素按顺序依次插入到给定队列中。
在插入过程中和插入完成后的任意时…*给定一个输入受限的双端队列即一个端点允许插入和删除另一个端点只允许删除的双端队列和一个长度为 N 的插入序列。插入序列中的元素两两不同。你需要将插入序列中的元素按顺序依次插入到给定队列中。
在插入过程中和插入完成后的任意时刻你可以随时删除队列中的现有元素如果有的话。将所有元素按删除顺序进行排列可以得到删除序列。
现在给定 K 个删除序列对于每个删除序列请你判断其能否通过给定插入序列得到。*
输入格式 第一行包含两个整数 N,K。第二行包含 N 个不同的整数表示插入序列。 接下来 K 行每行包含一个删除序列保证每个删除序列都是给定插入序列的一个排列。
输出格式 每个删除序列输出一行答案如果该删除序列可以通过给定插入序列得到则输出 yes否则输出 no。
数据范围 1≤N≤10^5, 1≤K≤10, 序列中元素的取值范围 [1,109]。
输入样例 5 4 10 2 3 4 5 10 3 2 5 4 5 10 3 2 4 2 3 10 4 5 3 5 10 4 2
输出样例 yes no yes yes
#includeiostream
using namespace std;
const int N100010;
int n,k;
int a[N],b[N],q[N]; //输入序列、删除序列、队列
bool check()
{int hh0,tt-1;for(int i0,j0;in;i){q[tt]a[i];while(hhtt){if(q[hh]b[j]) j,hh; //跟队头相等删除队头else if(q[tt]b[j]) j,tt--; //跟队尾相等删除队尾else break;}}return hhtt;
}
int main()
{cinnk;for(int i0;in;i) cina[i];while(k--){for(int i0;in;i) cinb[i];if(check()) coutyesendl;else coutnoendl;}return 0;
}