社区讨论
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 条回复,欢迎继续交流。
正在加载回复...