1 solutions
-
0
C++ :
#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){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } if(c[too].id==1&&c[x].value!=1) return vis[num]=1; if(c[too].id==2&&c[too].value==0){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } if(c[too].id==2&&c[too].value==1) return vis[num]=1; if(c[too].id==3){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } } if(c[num].value==1){ if(c[too].id==1&&c[x].value==1){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } if(c[too].id==1&&c[x].value!=1) return vis[num]=1; if(c[too].id==2&&c[x].value==0){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } if(c[too].id==2&&c[x].value!=0) return vis[num]=1; if(c[too].id==3){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } } if(c[num].value>1){ if(c[too].id==1) return vis[num]=1; if(c[too].id==2&&c[x].value==0){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } if(c[too].id==2&&c[x].value!=0) return vis[num]=1; if(c[too].id==3){ query(too)?vis[num]=1:vis[num]=2; return vis[num]==1?1:0; } } } 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); 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; }
- 1
Information
- ID
- 9124
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By