https://www.patest.cn/contests/pat-a-practise/1135
#include <bits/stdc++.h>
using namespace std;
vector<int> pre,ino;
struct TreeNode
{
int val;
TreeNode *left,*right;
TreeNode(int v=0,TreeNode *l=NULL,TreeNode *r=NULL):val(v),left(l),right(r){}
};
TreeNode *build(int preL,int preR,int inoL,int inoR)
{
if(preL>preR) return NULL;
int e=pre[preL],idx=inoL,pdx=preL;
while(idx<=inoR&&ino[idx]!=e) ++idx,++pdx;
TreeNode *r=new TreeNode(e);
r->left=build(preL+1,pdx,inoL,idx-1);
r->right=build(pdx+1,preR,idx+1,inoR);
return r;
}
bool cmp(const int &a,const int &b){
return abs(a)<abs(b);
}
bool help(TreeNode *r){
return !r||r->val>0;
}
bool checkrednode(TreeNode *r){
return help(r->left)&&help(r->right);
}
int isrbTree(TreeNode *r,bool &ret,bool &res)
{
if(r)
{
int lbc=isrbTree(r->left,ret,res);
int rbc=isrbTree(r->right,ret,res);
if(r->val<0&&!checkrednode(r)) res=0;
if(lbc!=rbc) ret=0;
return r->val>0?lbc+1:lbc;
}
return 1;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int m;
cin>>m;
pre.resize(m);
for(int i=0;i<m;++i) cin>>pre[i];
ino=pre;
sort(ino.begin(),ino.end(),cmp);
TreeNode *r=build(0,m-1,0,m-1);
bool ret=1,res=1;
isrbTree(r,ret,res);
r->val>0&&res&&ret?cout<<"Yes\n":cout<<"No\n";
}
return 0;
}