求助: 过了样例, 只有20分

P4387 【深基15.习9】验证栈序列

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 的结果.


|