95分求助
查看原帖
95分求助
70081
尹昱钦楼主2020/11/20 21:17

第四个点莫名tle 求助!!!

#include<iostream>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstring> 
#include<cstdio>
using namespace std;
const int maxn=1000005;
struct node{
	int id;
	int to;
	int value;
	int x1,x2;
}c[maxn*2];
int a[maxn],n,q;
stack<int> s;
string ss;
int cnt=1000000;
int vis[maxn*2],ans;
int sss(string ss){
	int n=0;
	for(int i=1;i<ss.length();i++) n+=(pow(10,ss.length()-i-1)*(ss[i]-'0'));
	return n;
}
int ssss(string ss){
	int n=0;
	for(int i=0;i<ss.length();i++) n+=(pow(10,ss.length()-i-1)*(ss[i]-'0'));
	return n;
}
int dfs(int num){
	if(c[num].id==0) return c[num].value=a[num];
	if(c[num].id==1){
		int x=dfs(c[num].x1),y=dfs(c[num].x2);
		if(x==1&&y==1) return c[num].value=1;
		else return c[num].value=0;
	}
	if(c[num].id==2){
		int x=dfs(c[num].x1),y=dfs(c[num].x2);
		if(x==0&&y==0) return c[num].value=0;
		else return c[num].value=1;
	}
	if(c[num].id==3){
		int x=dfs(c[num].x1);
		if(x==0) return c[num].value=1;
		else return c[num].value=0;
	}
}
bool query(int num){
	if(vis[num]==1) return 1;
	if(vis[num]==2) return 0;
	int too=c[num].to;
	int x=c[too].x1,y=c[too].x2;
	if(x==num) x=y;
	if(c[num].value==0){
		if(c[too].id==1&&c[x].value==1) return vis[num]=query(too);
		if(c[too].id==1&&c[x].value!=1) return vis[num]=1;
		if(c[too].id==2&&c[too].value==0) return vis[num]=query(too);
		if(c[too].id==2&&c[too].value==1) return vis[num]=1;
		if(c[too].id==3) return vis[num]=query(too);
	}
	if(c[num].value==1){
		if(c[too].id==1&&c[x].value==1) return vis[num]=query(too);
		if(c[too].id==1&&c[x].value!=1) return vis[num]=1;
		if(c[too].id==2&&c[x].value==0) return vis[num]=query(too);
		if(c[too].id==2&&c[x].value!=0) return vis[num]=1;
		if(c[too].id==3) return vis[num]=query(too);
	}
	if(c[num].value>1){
		if(c[too].id==1) return vis[num]=1;
		if(c[too].id==2&&c[x].value==0) return vis[num]=query(too);
		if(c[too].id==2&&c[x].value!=0) return vis[num]=1;
		if(c[too].id==3) return vis[num]=query(too);
	}
}
int main(){
	while(1){
		cin>>ss;
		if(ss[0]=='x') s.push(sss(ss));
		else{
			if('0'<=ss[0]&&ss[0]<='9'){
				n=ssss(ss);
				break;
			}
		else{
			if(ss[0]=='&'){
				c[++cnt].id=1;
				c[s.top()].to=cnt;
				c[cnt].x1=s.top();
				s.pop();
				c[s.top()].to=cnt;
				c[cnt].x2=s.top();
				s.pop();
				s.push(cnt);
			}else{
				if(ss[0]=='|'){
					c[++cnt].id=2;
					c[s.top()].to=cnt;
					c[cnt].x1=s.top();
					s.pop();
					c[s.top()].to=cnt;
					c[cnt].x2=s.top();
					s.pop();
					s.push(cnt);
				}else{
					if(ss[0]=='!'){
						c[++cnt].id=3;
						c[s.top()].to=cnt;
						c[cnt].x1=s.top();
						s.pop();
						s.push(cnt);
					}
				}
			}
		}
		}
	}
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	ans=dfs(cnt);
//	cout<<endl<<ans<<endl<<endl;
	if(n==1&&cnt==1000000){
		cout<<a[1];
		return 0;
	}
	cin>>q;
	vis[cnt]=2;
	for(int i=1;i<=q;i++){
		int qu;
		scanf("%d",&qu);
		if(query(qu)) printf("%d\n",ans);
		else printf("%d\n",!ans);
	}
	return 0;
}
2020/11/20 21:17
加载中...