Tokubara @ 2022-07-03 17:46:27
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cassert>
#include <stack>
#include <iostream>
using namespace std;
typedef long long LL;
int map[100001];
int main() {
/* freopen("input.txt", "r", stdin); */
int q;
scanf("%d", &q);
for(int k = 0; k < q; k++) {
bool valid = true;
int n;
stack<int> s;
scanf("%d", &n);
int in_tmp;
for(int i = 0; i < n; i++) {
scanf("%d", &in_tmp);
map[in_tmp]=i;
} // 这样入栈顺序就都是 1, ..., n
int out, out_tmp;
int j = 0; // 入栈起始的数, j 表示未入栈
for(int i = 0; i < n; i++) {
scanf("%d", &out_tmp);
out = map[out_tmp];
if(out >= j) {
while(j != out) {
s.push(j++);
}
j++; // 因为实际上相当于 push 再 pop, j 已经 push 了
} else if(!s.empty() && s.top() == out) {
s.pop();
} else {
valid = false;
break;
}
}
if (valid && s.empty()) {
puts("Yes");
} else {
puts("No");
}
}
return 0;
}
相比其它模拟方法, 我多了一个步骤, 就是映射, 比如输入是 3 2 1, 会把 3 映射为 0, 2 映射为 1, 1 映射为 0. 这样输入就成了顺序 0, 1, 2. 如果遇到错误, valid 置为 false.
只过了第 1 个点. 并且根据测评结果来看, 全都是应该为 Ye, 但输出是 No. 但本地测试中, 输入 6 全部的栈序列, 都给出了 Yes 的结果.