社区讨论
50pts WA+TLE
P7073[CSP-J 2020] 表达式参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj32ctd
- 此快照首次捕获于
- 2025/11/03 19:55 4 个月前
- 此快照最后确认于
- 2025/11/03 19:55 4 个月前
CPP
//人生中第一个指针建树:)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Treenode {
string name;
bool negate; // 如果此值为真,则此节点真正的数据为 !data
bool data;
Treenode *left, *right;
//解释左右子树如何用指针:
//如果左子树为空,则left为NULL
//如果左子树不为空,则left指向左子树
//如果右子树为空,则right为NULL
//如果右子树不为空,则right指向右子树
Treenode() {
name = "";
negate = false;
left = NULL;
right = NULL;
}
};
ll n, q;
stack<Treenode*> st;
unordered_map<string, Treenode*> mp;
bool AllisNum(string str) {
for(int i = 0; i < str.size(); i++) {
int tmp = (int)str[i];
if (tmp >= 48 && tmp <= 57) continue;
else return false;
}
return true;
}
bool calculate(Treenode* root) {
if (root == NULL) return false;
// 如果是叶子节点(变量节点)
if (root->left == NULL && root->right == NULL) {
bool result = root->data;
if (root->negate) result = !result;
return result;
}
// 递归计算左右子树
bool left_val = calculate(root->left);
if(root->name == "&" && !left_val) return root->negate;
if(root->name == "|" && left_val) return !(root->negate);
bool right_val = calculate(root->right);
bool result;
if (root->name == "&") result = left_val && right_val;
else if (root->name == "|") result = left_val || right_val;
// else {
// 如果是变量节点但又有子树(理论上不应该出现)
// result = root->data;
// }
// 如果运算符节点本身有negate标志
if (root->negate) result = !result;
return result;
}
int main() {
while(true) {
string s;
cin >> s;
if(AllisNum(s)) {
n = stoi(s);
break;
}
else if(s[0] == 'x') {
//申请新节点
Treenode *newnode = new Treenode();
newnode->name = s;
st.push(newnode);
mp[s] = newnode;
}
else if(s == "!") {
//取栈顶元素
Treenode *top = st.top();
st.pop();
top->negate = true;
st.push(top);
}
else if(s == "&" || s == "|") {
//取两个栈顶元素
Treenode *top1 = st.top();
st.pop();
Treenode *top2 = st.top();
st.pop();
//申请新节点
Treenode *newnode = new Treenode();
newnode->name = s;
newnode->left = top2;
newnode->right = top1;
st.push(newnode);
}
}
Treenode *root = st.top();
for(int i = 1; i <= n; i++) {
Treenode* x = mp["x" + to_string(i)];
cin >> x->data;
}
cin >> q;
while(q--) {
ll node;
cin >> node;
Treenode *x = mp["x" + to_string(node)];
x->negate = !x->negate;
cout << calculate(root) << "\n";
x->negate = !x->negate;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...