25pts求助
查看原帖
25pts求助
427045
cwxcplh楼主2024/12/20 20:40

各位大佬,这题我是真的不会调了,请各位大佬看一下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
int n,m,q,x,id,a[200006],c[200006],b[200006],bb[200006],son[200006][3];
inline void build();//构造一棵树
inline void dfs1(int now);//标记
inline void dfs(int now);//搜树
inline int sum(int now);//求值
signed main() {
	getline(cin,s);
	m=s.size();
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
		c[i]=a[i];
	}
	build();
	for(int i=0; i<=200000; i++) {
		bb[i]=1;
	}
	int ans=sum(id);
	a[id]=ans;
	dfs(id);
	cin>>q;
	while(q--) {
		cin>>x;
		if(bb[x]) {
			cout<<(!ans)<<endl;
		} else {
			cout<<ans<<endl;
		}
	}
}
inline int sum(int now) {
	if(b[now]==-1) {
		a[son[now][0]]=sum(son[now][0]);
		a[son[now][1]]=sum(son[now][1]);
		return (a[son[now][0]]&a[son[now][1]]);
	}
	if(b[now]==-2) {
		a[son[now][0]]=sum(son[now][0]);
		a[son[now][1]]=sum(son[now][1]);
		return (a[son[now][0]]|a[son[now][1]]);
	}
	if(b[now]==-3) {
		a[son[now][0]]=sum(son[now][0]);
		return (!a[son[now][0]]);
	}
	if(b[now]==0&&now<=n) {
		return a[now];
	}
}
inline void dfs1(int now) {
	if(now==0) {
		return;
	}
	bb[now]=0;
	dfs1(son[now][0]);
	dfs1(son[now][1]);
}
inline void dfs(int now) {
	if(now==0) {
		return;
	}
	if(b[now]==-1) {
		if(a[son[now][0]]==0) {
			dfs1(son[now][1]);
		}
		if(a[son[now][1]]==0) {
			dfs1(son[now][0]);
		} else {
			dfs(son[now][0]);
			dfs(son[now][1]);
		}
	} else if(b[now]==-2) {
		if(a[son[now][0]]==1) {
			dfs1(son[now][1]);
		}
		if(a[son[now][1]]==1) {
			dfs1(son[now][0]);
		} else {
			dfs(son[now][0]);
			dfs(son[now][1]);
		}
	} else {
		dfs(son[now][0]);
	}
}
inline void build() {
	id=n;
	stack<int>st;
	for(int i=0; i<m; i++) {
		if(s[i]=='&') {
			int y=st.top();
			st.pop();
			int z=st.top();
			st.pop();
			st.push(++id);
			son[id][0]=y;
			son[id][1]=z;
			b[id]=-1;
		} else if(s[i]=='|') {
			int y=st.top();
			st.pop();
			int z=st.top();
			st.pop();
			st.push(++id);
			son[id][0]=y;
			son[id][1]=z;
			b[id]=-2;
		} else if(s[i]=='x') {
			int y=0;
			i++;
			while(s[i]>='0'&&s[i]<='9') {
				y=y*10+s[i]-'0';
				i++;
			}
			st.push(y);
		} else if(s[i]=='!') {
			int y=st.top();
			st.pop();
			st.push(++id);
			son[id][0]=y;
			son[id][1]=-1;
			b[id]=-3;
		}
	}
}
2024/12/20 20:40
加载中...