社区讨论

75pts性感代码在线求调(悬关)

P7073[CSP-J 2020] 表达式参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m2jsf6ps
此快照首次捕获于
2024/10/22 09:49
去年
此快照最后确认于
2025/11/04 16:33
4 个月前
查看原帖
#15 #17 #18 #19 #20 WA了
CPP
#include<bits/stdc++.h>
using namespace std;
char s[5000010],fu[5000010];//s为原字符串,fu记录树上每非叶子节点是由哪一种符号算出 
stack<int> st;//记录树上节点下标的栈 
int n,q,x,cnt,len,temp;
int a[5000010],tree[100010][2],vis[100010];//tree记录左儿子和右儿子,vis记录叶子节点改变是否会影响总答案 
void dfs(int now){
    if(now<=n){
        vis[now]=1;//如果搜到叶节点,直接标记 
        return;
    }
    if(fu[now]=='&'){//考虑左儿子或右儿子的更改是否会对该节点产生影响 
        if(a[tree[now][0]]==0&&a[tree[now][1]]==1)dfs(tree[now][0]);//0&1=0中,若改变0,则会得到1&1=1,所以往左儿子继续搜 
        else if(a[tree[now][0]]==1&&a[tree[now][1]]==0)dfs(tree[now][1]);//1&0=0中,若改变0,则会得到1&1=1,所以往右儿子继续搜 
        else if(a[tree[now][0]]==1&&a[tree[now][1]]==1){//1&1=1中,若改变任意一个1,则会得到1&0=0(0&1=0),所以往左、右儿子继续搜 
            dfs(tree[now][0]);
            dfs(tree[now][1]);
        }
    }else if(fu[now]=='|'){
        if(a[tree[now][0]]==0&&a[tree[now][1]]==1)dfs(tree[now][1]);//0|1=1中,若改变1,则会得到0|0=0,所以往左右儿子继续搜 
        else if(a[tree[now][0]]==1&&a[tree[now][1]]==0)dfs(tree[now][0]);//1|0=1中,若改变1,则会得到0|0=0,所以往左儿子继续搜 
        else if(a[tree[now][0]]==0&&a[tree[now][1]]==0){//0|0=0中,若改变任意一个0,则会得到1|0=1(0|1=1),所以往左、右儿子继续搜 
            dfs(tree[now][0]);
            dfs(tree[now][1]);
        }
    }else dfs(tree[now][0]);//取反就直接往下搜 
    return;
}
int main(){
    cin.getline(s,1000010);
    len=strlen(s);
    cin>>n;
    cnt=n;
    for(int i=1;i<=n;i++)cin>>a[i];//1-n为叶子节点 
    for(int i=0;i<len;i++){
        if(s[i]=='x'){
            i++;
            temp=0;
            while(s[i]!=' '){
                temp=temp*10+s[i]-'0';
                i++;
            }
            st.push(temp);//将下标压栈 
        }else if(s[i]=='&'){
            fu[++cnt]=s[i];//记录符号 
            int num1=st.top();st.pop();
            int num2=st.top();st.pop();
            a[cnt]=a[num1]&a[num2];//运算 
            tree[cnt][0]=num2,tree[cnt][1]=num1;//建树 
            st.push(cnt);//将下标压栈 
        }else if(s[i]=='|'){
            fu[++cnt]=s[i];//记录符号 
            int num1=st.top();st.pop();
            int num2=st.top();st.pop();
            a[cnt]=a[num1]|a[num2];//运算 
            tree[cnt][0]=num2,tree[cnt][1]=num1;//建树 
            st.push(cnt);//将下标压栈 
        }else if(s[i]=='!'){
            fu[++cnt]=s[i];//记录符号 
            int num=st.top();st.pop();
            a[cnt]=!a[num];//运算 
            tree[cnt][0]=num;//建树 
            st.push(cnt);//将下标压栈 
        }
    }
    dfs(cnt);//搜索,记录叶子节点是否会对最终答案产生影响 
    cin>>q;
    for(int i=1;i<=q;i++){
        cin>>x;
        cout<<(a[cnt]^vis[x])<<endl;//答案 
    }
    return 0;
} 

回复

4 条回复,欢迎继续交流。

正在加载回复...