蒟蒻的表达式树为什么炸了?!在线求调(教)
查看原帖
蒟蒻的表达式树为什么炸了?!在线求调(教)
932094
caoruiqi楼主2024/8/8 11:23

35pts,WA on #1 #2 #3 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20

#include<bits/stdc++.h>
using namespace std;
int max(int a,int b){
	return a>b?a:b;
}
int min(int a,int b){
	return a<b?a:b;
}
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x*f;
}
void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
	return;
}
int tmp,n,i,p,cnt;
bool a[100001],fe[100001];
char c;
stack<int> q;
struct node{
	int num;
	bool pd=0,fann=0;
};
map<int,node> dot;
void dfs(int u){
	int tmp;
	tmp=q.top();
	q.pop();
	while(tmp==-3){
		tmp=q.top();
		q.pop();
		dot[u].fann^=1;
	}
	dot[u].num=tmp;
	if(tmp>0){
		dot[u].pd=a[tmp]^dot[u].fann;
	}
	else{
		dfs(u*2);
		dfs(u*2+1);
		if(tmp==-1){
			dot[u].pd=(dot[u*2].pd&dot[u*2+1].pd)^dot[u].fann;
		}
		else{
			dot[u].pd=(dot[u*2].pd|dot[u*2+1].pd)^dot[u].fann;
		}
	}
}
void f(int u){
	if(dot[u].num>0){
		fe[dot[u].num]=1;
		return;
	}
	f(u*2);
	f(u*2+1);
}
void fei(int u){
	bool flag1=1,flag2=1;
	if(dot[u].num==-1){
		if(dot[u*2].pd==0){
			f(u*2+1);
			flag2=0;
		}
		if(dot[u*2+1].pd==0){
			f(u*2);
			flag1=0;
		}
	}
	else if(dot[u].num==-2){
		if(dot[u*2].pd==1){
			f(u*2+1);
			flag2=0;
		}
		if(dot[u*2+1].pd==1){
			f(u*2);
			flag1=0;
		}
	}
	else{
		return;
	}
	if(flag1){
		fei(u*2);
	}
	if(flag2){
		fei(u*2+1);
	}
}
int main(){
	//freopen("P7073.in","r",stdin);
	//freopen(".out","w",stdout);
	c=getchar();
	while(c!='\n'){
		if(c=='x'){
			tmp=0;
			c=getchar();
			while(c>='0'&&c<='9'){
				tmp=(tmp<<3)+(tmp<<1)+(c^48);
				c=getchar();
			}
			q.push(tmp);
		}
		else if(c=='&'){
			q.push(-1);
			c=getchar();
		}
		else if(c=='|'){
			q.push(-2);
			c=getchar();
		}
		else if(c=='!'){
			q.push(-3);
			c=getchar();
		}
		else if(c=='\n'){
			break;
		}
		else{
			c=getchar();
		}
	}
	n=read();
	for(i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1);
	fei(1);
	p=read();
	for(i=1;i<=p;i++){
		tmp=read();
		write(dot[1].pd^(!fe[tmp]));
		puts("");
	}
	return 0;
}
2024/8/8 11:23
加载中...