如题,有没有大佬能帮帮我啊
提交记录https://www.luogu.com.cn/record/183656605
#include<bits/stdc++.h>
using namespace std;
char sgeet,tp;
long long st[1000005];int top;
bool fians;
long long cnt=100050;
long long n,m;
long long read(int x,char &sgeet){ // cout<<'b';
sgeet=getchar(); // cout<<ch;
long long rt=x;
while(sgeet<='9'&&sgeet>='0'){
rt*=10;
rt+=sgeet-'0';
sgeet=getchar(); // cout<<ch;
} // cout<<endl;
return rt;
}
struct node{
int fa;
bool type; //0 shu 1 suan
long long num; int type1; //0& 1| 2!
long long l,r; bool ifcg,ans;
}a[4000005];
void dfs(int p){ //cout<<p<<" "<<a[p].num<<" "<<a[p].type1<<" "<<a[p].l<<" "<<a[p].r<<endl;
if(p==0)return;
if(a[p].type==0){
return ;
}
if(p==cnt){
a[p].ifcg=1;
}
if(a[p].ifcg==0){
a[a[p].l].ifcg=0;
a[a[p].r].ifcg=0;
dfs(a[p].l);
dfs(a[p].r);
}
else{
if(a[p].type1==0){
if(a[a[p].l].ans==0){
if(a[a[p].r].ans==0){
a[a[p].l].ifcg=0;
a[a[p].r].ifcg=0;
dfs(a[p].l);
dfs(a[p].r);
}
else{
a[a[p].l].ifcg=1;
a[a[p].r].ifcg=0;
dfs(a[p].l);
dfs(a[p].r);
}
}
else{
if(a[a[p].r].ans==0){
a[a[p].l].ifcg=0;
a[a[p].r].ifcg=1;
dfs(a[p].l);
dfs(a[p].r);
}
else{
a[a[p].l].ifcg=1;
a[a[p].r].ifcg=1;
dfs(a[p].l);
dfs(a[p].r);
}
}
}
else if(a[p].type1==1){
if(a[a[p].l].ans==0){
if(a[a[p].r].ans==0){
a[a[p].l].ifcg=1;
a[a[p].r].ifcg=1;
dfs(a[p].l);
dfs(a[p].r);
}
else{
a[a[p].l].ifcg=0;
a[a[p].r].ifcg=1;
dfs(a[p].l);
dfs(a[p].r);
}
}
else{
if(a[a[p].r].ans==0){
a[a[p].l].ifcg=1;
a[a[p].r].ifcg=0;
dfs(a[p].l);
dfs(a[p].r);
}
else{
a[a[p].l].ifcg=1;
a[a[p].r].ifcg=1;
dfs(a[p].l);
dfs(a[p].r);
}
}
}
else{
a[a[p].l].ifcg=1;
dfs(a[p].l);
}
}
return ;
}
bool sgeetsum(int p){
if(a[p].type==0){
a[p].ans=a[p].num;
return a[p].num;
}
if(a[p].type1==0){
a[p].ans=sgeetsum(a[p].l)&sgeetsum(a[p].r);
return a[p].ans;
}
if(a[p].type1==1){
a[p].ans=sgeetsum(a[p].l)|sgeetsum(a[p].r);
return a[p].ans;
}
if(a[p].type1==2){
a[p].ans=1-sgeetsum(a[p].l);
return a[p].ans;
}
}
void ckdfs(int p){
if(a[p].type==0){
cout<<'x'<<p<<": "<<a[p].num<<" cg:"<<a[p].ifcg<<endl;
return ;
}
cout<<'c'<<p<<" ";
if(a[p].type1==0)cout<<" "<<a[p].l<<'&'<<" "<<a[p].r<<" t ans:"<<a[p].ans<<" cg:"<<a[p].ifcg<<endl;
else if(a[p].type1==1)cout<<" "<<a[p].l<<'|'<<" "<<a[p].r<<" t ans:"<<a[p].ans<<" cg:"<<a[p].ifcg<<endl;
else cout<<" "<<a[p].l<<'!'<<" t ans:"<<a[p].ans<<" cg:"<<a[p].ifcg<<endl;
ckdfs(a[p].l);
if(a[p].r)ckdfs(a[p].r);
}
int main(){
//freopen("2.in","r",stdin);
//freopen("2.out","w",stdout);
cin>>sgeet;
st[++top]=read(0,sgeet); //cout<<'c';
sgeet=tp;
while(sgeet!=10){
sgeet=getchar();if(sgeet==10)break;
while(sgeet==' ')sgeet=getchar();
if(sgeet==10)break;
if(sgeet=='x'){
st[++top]=read(0,sgeet);
sgeet=tp;
if(sgeet==10)break;
}
else if(sgeet=='&'){ //cout<<"here";
a[++cnt].type=1;
a[cnt].type1=0;
a[cnt].l=st[top--];
a[a[cnt].l].fa=cnt;
a[cnt].r=st[top--];
a[a[cnt].r].fa=cnt;
st[++top]=cnt;
}
else if(sgeet=='|'){
a[++cnt].type=1;
a[cnt].type1=1;
a[cnt].l=st[top--];
a[a[cnt].l].fa=cnt;
a[cnt].r=st[top--];
a[a[cnt].r].fa=cnt;
st[++top]=cnt;
}
else if(sgeet=='!'){
a[++cnt].type=1;
a[cnt].type1=2;
a[cnt].l=st[top--];
a[a[cnt].l].fa=cnt;
st[++top]=cnt;
}
else {
// n=read(sgeet-'0');
//cout<<int(sgeet)<<"???????????"<<endl;
}
} // cout<<'q';
// cout<<endl<<"st"<<top<<" "<<st[top]<<endl;
cin>>n;
//cout<<endl<<"!n!"<<n<<endl;
for(int i=1;i<=n;i++){
cin>>a[i].num;
}
fians=sgeetsum(cnt);
// ckdfs(cnt);
dfs(cnt);
//ckdfs(cnt);
//cout<<fians<<endl;
//for(int i=1;i<=n;i++){
// cout<<a[i].ifcg<<" ";
//}
long long q,fitp;
cin>>q; //cout<<fians<<endl;
for(int i=1;i<=q;i++){
cin>>fitp;
if(a[fitp].ifcg)cout<<1-fians<<endl;
else cout<<fians<<endl;
}
return 0;
}
/*
x1 x2 & x3 |
3
1 0 1
*/