求调试
查看原帖
求调试
782972
xxykd楼主2025/8/31 20:30
#include<iostream>
#include<stack>

using namespace std;

char s[1000005],k;

int a[100005],son[100005][2],ck,flag[100005],c[100005],n,q,len;

int dfs(int u,int g){
	a[u]^=g;
	if(u<=n){
		return a[u];
	}
	int x=dfs(son[u][0],g^flag[son[u][0]]);
	int y=dfs(son[u][1],g^flag[son[u][1]]);
	if(a[u]==2){
		if(x==0){
			c[son[u][1]]=1;
		}
		if(y==0){
			c[son[u][0]]=1;
		}
		return x&y;
	}
	else{
		if(x==1){
			c[son[u][1]]=1;
		}
		if(y==1){
			c[son[u][0]]=1;
		}
		return x|y;
	}
}

void dfs2(int u){
	if(u<=n){
		return ;
	}
	c[son[u][0]]|=c[u];
	c[son[u][1]]|=c[u];
	dfs2(son[u][0]);
	dfs2(son[u][1]);
}

int main(){
	k=getchar();
	do{
		s[len++]=k;
		k=getchar();
	}
	while(k^'\r'&&k^'\n');
	scanf("%d",&n);
	ck=n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	stack<int> b;
	for(int i=0;s[i];i+=2){
		if(s[i]=='x'){
			int x=0;
			i++;
			while(s[i]!=' '){
				x=x*10+s[i]-'0';
				i++;
			}
			i--;
			b.push(x);
		}
		else if(s[i]=='&'){
			int x=b.top();
			b.pop();
			int y=b.top();
			b.pop();
			b.push(++ck);
			a[ck]=2;
			son[ck][0]=x;
			son[ck][1]=y;
		}
		else if(s[i]=='|'){
			int x=b.top();
			b.pop();
			int y=b.top();
			b.pop();
			b.push(++ck);
			a[ck]=3;
			son[ck][0]=x;
			son[ck][1]=y;
		}
		else if(s[i]=='!'){
			flag[b.top()]^=1;
		}
	}
	int ans=dfs(ck,flag[ck]);
	dfs2(ck);
	scanf("%d",&q);
	while(q--){
		int z;
		scanf("%d",&z);
		printf("%d\n",c[z]?ans:!ans);
	}
	return 0;
}

哪个大佬能够为蒟蒻解释一下为什么会MLE

2025/8/31 20:30
加载中...