社区讨论

[CSP-J2020] 表达式复赛在线求调

学术版参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m2ne7fmf
此快照首次捕获于
2024/10/24 22:22
去年
此快照最后确认于
2025/11/04 16:16
4 个月前
查看原帖
CPP
#include<iostream>
#include<iomanip>
#include<string>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<map>
#include<deque>
#include<stack>
#include<set>
#include<vector>
#define ll long long
#define ull unsigned long long
using namespace std;
const int N = 1e6 + 5;
struct edge{
	ll value, left_root, right_root, identifier;
	char symbol;
};
edge tree[N];
char x[N];
bool f[N];
ll n, q, ops[N];
stack<ll> s;
ll tree_num;
void build(ll length){
	for(int i = 0; i < length; i ++){
		if(x[i] == 'x'){
			ll num = 0;
			while(isdigit(x[++ i])){
				num = (num << 1) + (num << 3) + x[i] ^ 48;
			}
			tree_num ++;
			tree[tree_num].value = ops[num];
			tree[tree_num].identifier = num;
			tree[tree_num].symbol = '0';
			s.push(tree_num);
		} else if(x[i] != ' '){
			ll tree_left = s.top();
			s.pop();
			tree_num ++;
			if(x[i] == '!'){
				tree[tree_num].value = tree[tree_left].value ^ 1;
				tree[tree_num].left_root = tree_left;
			} else {
				ll tree_right = s.top();
				s.pop();
				tree[tree_num].left_root = tree_left;
				tree[tree_num].right_root = tree_right;
				if(x[i] == '&'){
					tree[tree_num].value = tree[tree_left].value & tree[tree_right].value;
				} else {
					tree[tree_num].value = tree[tree_left].value | tree[tree_right].value;
				}
			}
			s.push(tree_num);
			tree[tree_num].symbol = x[i];
			
		}
	}
	return;
}
void dfs(ll rt){
	if(tree[rt].symbol == '0'){
		f[tree[rt].identifier] = true;
		return;
	}
	if(tree[rt].symbol == '!'){
		dfs(tree[rt].left_root);
	} else if(tree[rt].symbol == '&'){
		if(tree[tree[rt].left_root].value + tree[tree[rt].right_root].value == 1){
			if(tree[tree[rt].left_root].value == 0){
				dfs(tree[rt].left_root);
			} else {
				dfs(tree[rt].right_root);
			}
		} else if(tree[tree[rt].left_root].value + tree[tree[rt].right_root].value == 2){
			dfs(tree[rt].left_root);
			dfs(tree[rt].right_root);
		}
	} else if(tree[rt].symbol == '|'){
		if(tree[tree[rt].left_root].value + tree[tree[rt].right_root].value == 1){
			if(tree[tree[rt].left_root].value == 1){
				dfs(tree[rt].left_root);
			} else {
				dfs(tree[rt].right_root);
			}
		} else if(tree[tree[rt].left_root].value + tree[tree[rt].right_root].value == 0){
			dfs(tree[rt].left_root);
			dfs(tree[rt].right_root);
		}
	}
}
int main(){
	//freopen("fraction.in","r",stdin);
	//freopen("fraction.out","w",stdout);
	cin.getline(x, 1000005);
	ll length = strlen(x);
	cin >> n;
	for(int i = 1; i <= n; i ++){
		cin >> ops[i];
	}
	build(length);
	dfs(tree_num);
	ll ans = tree[s.top()].value;
	cin >> q;
	while(q --){
		ll question;
		cin >> question;
		cout << (f[question] ^ ans) << endl;
	}
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}
大佬们帮我调调,15pts 周六CSP-J复赛,帮帮蒟蒻吧!!!

回复

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

正在加载回复...