RT,后六个点T了,我太蒻了,求大佬帮忙看看怎么优化
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
string s;
int n,q,t,cnt;
bool ans;
struct Node{
bool tag=0,f; //无影响标记,布尔值
int bh,ls,rs,fa,ftp; //编号,左儿子,右儿子,父亲,运算符类型
}tree[5*N],t1,t2;
stack <Node> stk;
int strtonum(string s){
int x=0;
for(int i=0;i<s.size();i++){
x=10*x+s[i]-'0';
}
return x;
}
void maketree(){ //后缀表达式建树
s+=' ';
string sub;
int k,num;
while(s.size()){
k=s.find(' ');
sub=s.substr(0,k);
s=s.substr(k+1,s.size());
if(sub.size()==1){
if(sub[0]=='&'){
t1=stk.top();
stk.pop();
t2=stk.top();
stk.pop();
cnt++;
tree[cnt].bh=cnt;
tree[cnt].f=t1.f&&t2.f;
tree[cnt].ls=t1.bh;
tree[cnt].rs=t2.bh;
tree[cnt].ftp=1;
tree[t1.bh].fa=cnt;
tree[t2.bh].fa=cnt;
stk.push(tree[cnt]);
}else if(sub[0]=='|'){
t1=stk.top();
stk.pop();
t2=stk.top();
stk.pop();
cnt++;
tree[cnt].bh=cnt;
tree[cnt].f=t1.f||t2.f;
tree[cnt].ls=t1.bh;
tree[cnt].rs=t2.bh;
tree[cnt].ftp=2;
tree[t1.bh].fa=cnt;
tree[t2.bh].fa=cnt;
stk.push(tree[cnt]);
}else{
t1=stk.top();
stk.pop();
cnt++;
tree[cnt].ftp=3;
tree[cnt].bh=cnt;
tree[cnt].f=!t1.f;
tree[cnt].ls=t1.bh;
tree[t1.bh].fa=cnt;
stk.push(tree[cnt]);
}
}else{
sub=sub.substr(1,sub.size());
num=strtonum(sub);
tree[num].bh=num;
stk.push(tree[num]);
}
}
}
void solvetag(int x){ //打标记
if(x<=n) return;
if(tree[x].tag){
tree[tree[x].ls].tag=1;
tree[tree[x].rs].tag=1;
}else{
if(tree[x].ftp==1){
if(!tree[tree[x].rs].f){
tree[tree[x].ls].tag=1;
}
if(!tree[tree[x].ls].f){
tree[tree[x].rs].tag=1;
}
}
if(tree[x].ftp==2){
if(tree[tree[x].rs].f){
tree[tree[x].ls].tag=1;
}
if(tree[tree[x].ls].f){
tree[tree[x].rs].tag=1;
}
}
}
solvetag(tree[x].ls);
solvetag(tree[x].rs);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
getline(cin,s);
cin>>n;
cnt=n;
for(int i=1;i<=n;i++){
cin>>tree[i].f;
}
maketree();
solvetag(cnt);
cin>>q;
while(q--){
cin>>t;
if(tree[t].tag==1) cout<<tree[cnt].f<<endl;
else cout<<!tree[cnt].f<<endl;
}
return 0;
}