1 solutions

  • 0
    @ 2024-12-5 18:12:19

    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