社区讨论

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 条回复,欢迎继续交流。

正在加载回复...