1 条题解

  • 0
    @ 2025-10-8 16:59:46
    #include<bits/stdc++.h>//sscanf非常耗时间(70分):
    using namespace std;
    #define lc(p) tr[p].ls
    #define rc(p) tr[p].rs
    const int N=1e5+10;
    char s[1110000],ss[110],cc;
    struct node
    {
        int op,ls,rs,t,d,ck;
    }tr[2*N];int trlen,n;
    int sta[2*N];int tp;
    void predfs(int p)
    {
        if(p<=n) return ;
        predfs(lc(p));predfs(rc(p));
        int d1=tr[lc(p)].d ^ tr[lc(p)].t;
        int d2=tr[rc(p)].d ^ tr[rc(p)].t;
        tr[p].d=(tr[p].op==1)?(d1 & d2):(d1 | d2);
    }
    void dfs(int p,int fa)
    {
        tr[p].ck+=tr[fa].ck;
        if(p<=n){return ;}
        int d1=tr[lc(p)].d ^ tr[lc(p)].t;
        int d2=tr[rc(p)].d ^ tr[rc(p)].t;
        if(tr[p].op==1 && d1==0) tr[rc(p)].ck++;
        if(tr[p].op==1 && d2==0) tr[lc(p)].ck++;
        if(tr[p].op==2 && d1==1) tr[rc(p)].ck++;
        if(tr[p].op==2 && d2==1) tr[lc(p)].ck++;
        dfs(lc(p),p);dfs(rc(p),p);
    }
    int main()
    {
        memset(tr,0,sizeof(tr));
        cin.getline(s,1000010);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&tr[i].d);
        trlen=n;char *st=s;
        int len=strlen(s);
        while(st<s+len)
        {
            sscanf(st,"%s",ss);
            if(ss[0]=='x')
            {
                int x;sscanf(ss,"%c%d",&cc,&x);
                ++tp;sta[tp]=x;
            }
            else if(ss[0]=='!') tr[sta[tp]].t^=1;
            else if(ss[0]=='&')
            {
                ++trlen;tr[trlen]={1,sta[tp],sta[tp-1],0,0,0};
                tp--;
                tp--;
                ++tp;sta[tp]=trlen;
            }
            else if(ss[0]=='|')
            {
                ++trlen;tr[trlen]={2,sta[tp],sta[tp-1],0,0,0};
                tp--;
                tp--;
                ++tp;sta[tp]=trlen;
            }
            st+=strlen(ss)+1;
        }
        predfs(trlen);
        dfs(trlen,0);
        int q;scanf("%d",&q);
        int ans=tr[trlen].d ^ tr[trlen].t;
        while(q--)
        {
            int x;scanf("%d",&x);
            if(tr[x].ck) printf("%d\n",ans);
            else printf("%d\n",!ans);
        }
        return 0;
    }
    
    #include<bits/stdc++.h>//标程
    using namespace std;
    #define lc(p) tr[p].ls
    #define rc(p) tr[p].rs
    const int N=1e5+10;
    char s[1110000],ss[110],cc;
    struct node
    {
        int op,ls,rs,t,d;bool ck;
    }tr[2*N];int trlen,n;
    
    void predfs(int p)
    {
        if(p<=n) return ;
        predfs(lc(p));predfs(rc(p));
        int d1=tr[lc(p)].d ^ tr[lc(p)].t;
        int d2=tr[rc(p)].d ^ tr[rc(p)].t;
        tr[p].d=(tr[p].op==1)?(d1 & d2):(d1 | d2);
    }
    void dfs(int p,int fa)
    {
        tr[p].ck|=tr[fa].ck;
        if(p<=n){return ;}
        int d1=tr[lc(p)].d ^ tr[lc(p)].t;
        int d2=tr[rc(p)].d ^ tr[rc(p)].t;
        if(tr[p].op==1)
        {
            if(d1==0) tr[rc(p)].ck=1;
            if(d2==0) tr[lc(p)].ck=1;
        } 
        if(tr[p].op==2)
        {
            if(d1==1) tr[rc(p)].ck=1;
            if(d2==1) tr[lc(p)].ck=1;
        }
        dfs(lc(p),p);dfs(rc(p),p);
    }
    int main()
    {
        memset(tr,0,sizeof(tr));
        cin.getline(s,1000010);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&tr[i].d);
        trlen=n;
        stack<int> sta;
        for(int i=0;s[i];i++)
        {
            if(s[i]=='x')
            {
                i++;
                int x=0;while(s[i]!=' ')x=x*10+s[i]-'0',i++;
                sta.push(x);
            }
            else if(s[i]=='!') tr[sta.top()].t^=1,i++;
            else if(s[i]=='&')
            {
                int x=sta.top();sta.pop();
                int y=sta.top();sta.pop();
                tr[++trlen]={1,x,y,0,0,0};
                sta.push(trlen);
                i++;
            }
            else if(s[i]=='|')
            {
                int x=sta.top();sta.pop();
                int y=sta.top();sta.pop();
                tr[++trlen]={2,x,y,0,0,0};
                sta.push(trlen);
                i++;
            }
        }
        predfs(trlen);
        dfs(trlen,0);
        int q;scanf("%d",&q);
        int ans=tr[trlen].d ^ tr[trlen].t;
        while(q--)
        {
            int x;scanf("%d",&x);
            if(tr[x].ck) printf("%d\n",ans);
            else printf("%d\n",!ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2006
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    63
    已通过
    21
    上传者