请dalao瞅一眼问题在哪,好像有的NO没判出来
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define INF 0x3f3f3f3f
#define il inline
#define pb push_back
#define ft first
#define sd second
#define mp make_pair
#define INF 0x3f3f3f3f
#define pb push_back
#define P pair<int,int>
//#define cin fin
//#define cout fout
//ifstream cin("文件名.in");
//ofstream cout("文件名.out");
const int MAXN = 2e5;
int las[MAXN + 5], pre[MAXN + 5], a[MAXN + 5];
vector<int> v[MAXN + 5];
bool sha[MAXN + 5];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
for(int o = 0; o < t; ++o){
int n;
cin >> n;
int cnt0 = 0;
bool flag = 0;
for(int i = 1; i <= n; ++i){
pre[i] = i + 1;
las[i] = i - 1;
cin >> a[i];
if(a[i] == 0)cnt0++;
v[a[i]].pb(i);
}
if(cnt0 != 1){
cout << "NO" << endl;
for(int i = n - 1; i >= 0; --i)v[i].clear();
continue;
}
for(int i = n - 1; i >= 1; --i){
for(int j = 0; j < (int)v[i].size(); ++j){
int last = las[v[i][j]], pren = pre[v[i][j]];
if((last != 0 && a[last]== i - 1 ) || (pren != n + 1 && a[pren] == i - 1)){
pre[last] = pren;
las[pren] = last;
sha[v[i][j]] = 1;
}
else if(v[i][j] == n || a[pren] != i){
flag = 1;
break;
}
}
if(flag){
break;
}
for(int j = 0; j < (int)v[i].size(); ++j){
if(!sha[v[i][j]]){
int last = las[v[i][j]], pren = pre[v[i][j]];
pre[last] = pren;
las[pren] = last;
sha[v[i][j]] = 1;
}
}
}
if(!flag){
for(int i = 1; i <= n; ++i){
if(a[i] != 0 && !sha[i]){
flag = 1;
break;
}
}
}
if(flag)cout << "NO" << endl;
else cout <<"YES"<<endl;
for(int i = 1; i <= n; ++i)sha[i] = 0;
for(int i = n - 1; i >= 0; --i)v[i].clear();
}
return 0;
}