70pts MLE 求助
查看原帖
70pts MLE 求助
151924
YueYang1235楼主2021/2/10 21:27

蒟蒻求助qwq

#include<bits/stdc++.h>
using namespace std;
string s;
int n,a[105000],b[105000];
int son[2050000][3],sym[2050000];//1:!,2:&,3:|;
int q,x,cnt,ans;
int dfs1(int u){
	if(u<=n)return a[u];
	if(sym[u]==1)return !dfs1(son[u][1]);
	if(sym[u]==2){
		int x=dfs1(son[u][1]),y=dfs1(son[u][2]);
		if(x==0)b[son[u][2]]=1;
		if(y==0)b[son[u][1]]=1;
		return x&y;
	}
	if(sym[u]==3){
		int x=dfs1(son[u][1]),y=dfs1(son[u][2]);
//		if(u==6)cout<<x<<" "<<y<<" "<<son[u][1]<<endl;
		if(x==1)b[son[u][2]]=1;
		if(y==1)b[son[u][1]]=1;		
		return x|y;
	}
}
void dfs2(int u,int flag){
	if(u==0)return;
//	cout<<u<<" "<<flag<<endl;
	if(flag==1)b[u]=1;
	if(b[u]==1)flag=1;
	dfs2(son[u][1],flag);
	dfs2(son[u][2],flag);
}
int main(){
	getline(cin,s);
	scanf("%d",&n);cnt=n;
	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
	stack<int> st;
	for(int i=0;i<s.size();i++){
		if(s[i]==' '||(s[i]>='0'&&s[i]<='9'))continue;
		if(s[i]=='x'){
 			int pos=0;
			for(int j=i+1;s[j]!=' ';++j)pos=pos*10+s[j]-'0';
			st.push(pos);
		}
		else{
			if(s[i]=='!'){
				son[++cnt][1]=st.top();
				sym[cnt]=1;
				st.pop();
				st.push(cnt);
			}
			else if(s[i]=='&'){
				son[++cnt][1]=st.top();
				sym[cnt]=2;
				st.pop();
				son[cnt][2]=st.top();
				st.pop();
				st.push(cnt);
			}
			else if(s[i]=='|'){
				son[++cnt][1]=st.top();
				sym[cnt]=3;
				st.pop();
				son[cnt][2]=st.top();
				st.pop();
				st.push(cnt);
//				if(cnt==6)cout<<son[cnt][1]<<" "<<son[cnt][2]<<endl;
			}
//			printf("%d %d %d %d %d ",i,cnt,sym[cnt],son[cnt][1],son[cnt][2]);
		}
//		printf("%d\n",st.top());
//			if(cnt==4)printf("%d %d\n",son[cnt][1],son[cnt][2]);
	}
//	cout<<son[cnt][1]<<" "<<son[cnt][2]<<endl;
	ans=dfs1(cnt);
	dfs2(cnt,0);
	scanf("%d",&q);
	while(q--){
		scanf("%d",&x);
		if(b[x]==1)printf("%d\n",ans);
		else printf("%d\n",!ans);
	}
	return 0;
}

记录

2021/2/10 21:27
加载中...