求调…………………………(引荐黑体大佬)
查看原帖
求调…………………………(引荐黑体大佬)
1054952
zzCX_df楼主2024/12/13 21:34
#include <bits/stdc++.h>
#define qwq puts("debug");

using namespace std;

const int N = 1100000;
struct Treenode {
	int l, r, type, val;
	bool f;
} a[N];
int n, m, q, p[N];
char ch;
stack<int> s;

inline void dfsinit(int p) {
	if (!a[p].type)
		return;
	if (a[p].type == -1) {
		dfsinit(a[p].l);
		a[p].val = !a[a[p].l].val;
	} else if (a[p].type == -2) {
		dfsinit(a[p].l);
		dfsinit(a[p].r);
		a[p].val = a[a[p].l].val & a[a[p].r].val;
	} else {
		dfsinit(a[p].l);
		dfsinit(a[p].r);
		a[p].val = a[a[p].l].val | a[a[p].r].val;
	}
}

inline void dfsf(int p) {
	if (!a[p].type)
		return;
	int l = a[p].l, r = a[p].r;
	if (a[p].type == -1) {
		a[l].f = a[p].f;
		dfsf(l);
	} else if (a[p].type == -2) {
		if (a[l].val == 0)
			a[r].f = false;
		else
			a[r].f = a[p].f;
		if (a[r].val == 0)
			a[l].f = false;
		else
			a[l].f = a[p].f;
		dfsf(l);
		dfsf(r);
	} else {
		if (a[l].val == 1)
			a[r].f = false;
		else
			a[r].f = a[p].f;
		if (a[r].val == 1)
			a[l].f = false;
		else
			a[l].f = a[p].f;
		dfsf(l);
		dfsf(r);
	}
}

int main() {
	while (1) {
		scanf("%c", &ch);
		if (ch == '\n')
			break;
		n++;
		if (ch == 'x') {
			int sum = 0;
			while (1) {
				scanf("%c", &ch);
				if (ch >= '0' && ch <= '9')
					sum = (sum << 1) + (sum << 3) + (ch ^ 48);
				else
					break;
			}
			p[sum] = n;
			s.push(n);
		} else {
			if (ch == '&' || ch == '|') {
				int l = s.top();
				s.pop();
				int r = s.top();
				s.pop();
				if (ch == '&')
					a[n].type = -2;
				else
					a[n].type = -3;
				a[n].l = l;
				a[n].r = r;
				s.push(n);
			} else {
				int son = s.top();
				s.pop();
				a[n].type = -1;
				a[n].l = son;
				s.push(n);
			}
			scanf("%c", &ch);
		}
		if (ch != ' ')
			break;
	}
	dfsinit(s.top());
	scanf("%d", &m);
	for (int i = 1; i <= m; i++) {
		int x;
		scanf("%d", &x);
		a[p[i]].val = x;
	}
	a[s.top()].f = true;
	dfsf(s.top());
	scanf("%d", &q);
	for (; q--; ) {
		int qx;
		scanf("%d", &qx);
		if (a[p[qx]].f)
			printf("%d\n", a[s.top()].val ^ 1);
		else
			printf("%d\n", a[s.top()].val);
	}
	return 0;
}
2024/12/13 21:34
加载中...