MLE 求助
查看原帖
MLE 求助
1054952
zzCX_df楼主2025/7/30 18:20
#include <bits/stdc++.h>

using namespace std;

const int N = 1100000;
struct Tree {
	int l, r;
} p[N];
int n, m, Q, top, cnt, q[N], v[N], side[N];
char s[10], b[N];
bool fan[N], ans[N];

inline void dfs(int x) {
	if (!side[x]) {
		v[x] ^= fan[x];
		return;
	}
	dfs(p[x].l);
	dfs(p[x].r);
	if (side[x] == 1)
		v[x] = v[p[x].l] & v[p[x].r];
	if (side[x] == 2)
		v[x] = v[p[x].l] | v[p[x].r];
	v[x] ^= fan[x];
}

inline void find(int x) {
	if (!side[x]) {
		ans[x] = true;
		return;
	}
	if (v[p[x].l] && side[x] == 1)
		find(p[x].r);
	if (!v[p[x].l] && side[x] == 2)
		find(p[x].r);
	if (v[p[x].r] && side[x] == 1)
		find(p[x].l);
	if (!v[p[x].r] && side[x] == 2)
		find(p[x].l);
}

int main() {
	while (1) {
		scanf("%s", s + 1);
		if (s[1] >= '0' && s[1] <= '9') {
			n = s[1] - '0';
			break;
		}
		if (s[2] >= '0' && s[2] <= '9')
			b[++cnt] = s[2];
		else 
			b[++cnt] = s[1];
	}
	m = n;
	for (int i = 1; i <= cnt; i++) {
		if (b[i] >= '0' && b[i] <= '9')
			q[++top] = b[i] - '0';
		else  if (b[i] == '!') 
			fan[q[top]] = true;
		else if (b[i] == '&') {
			int u = q[top--];
			int v = q[top--];
			p[++m].l = u;
			p[m].r = v;
			side[m] = 1;
			q[++top] = m;
		} else {
			int u = q[top--];
			int v = q[top--];
			p[++m].l = u;
			p[m].r = v;
			side[m] = 2;
			q[++top] = m;
		}
	}
	for (int i = 1; i <= n; i++)
		scanf("%d", &v[i]);
	dfs(m);
	find(m);
	scanf("%d", &Q);
	for (; Q--; ) {
		int x;
		scanf("%d", &x);
		printf("%d\n", ans[x] ^ v[m]);
	}
	return 0;
}
2025/7/30 18:20
加载中...