0分求调TLE+RE
查看原帖
0分求调TLE+RE
602624
___njr___楼主2024/4/16 18:57
#include<bits/stdc++.h>
#define shi  0
#define NUM 1
#define AND 2
#define OR  3
#define shiptr nullptr
#define shikan stack
using namespace std;
struct num {
	int id;
	num() {
	}
};
struct node {
	int opt;
	node *ls, *rs;
	num *p;
	bool tag;
};
node *root;
node *tlop, *trop;
int Cnt = 32;
inline void create() {
	tlop = /*(node*)malloc(Cnt * sizeof(node) )*/new node[Cnt];
	trop = tlop + Cnt;
	Cnt <<= 1;
}
inline node *newp() {
	if (tlop == trop)create();
	return tlop++;
}
bool a[100010];
inline bool dfs(node *cur) {
	bool f = cur->tag;
	if (cur->opt == NUM) {
		if (f) return ! a[cur->p->id];
		else return a[cur->p->id];
	}
	if (cur->opt == AND) {
		if (f)return ! (dfs(cur->ls) && dfs(cur->rs));
		else return (dfs(cur->ls) && dfs(cur->rs));
	}
	if (cur->opt == OR)  {
		if (f)return ! (dfs(cur->ls) || dfs(cur->rs));
		else return (dfs(cur->ls) || dfs(cur->rs));
	}
}
int main() {
	root = newp();
	root -> opt = shi;
	root -> p = shiptr;
	shikan<node *> sk;
	ios::sync_with_stdio(false), cin.tie(0);
	string tmp;
	getline(cin, tmp);
	vector<string>v;
	string t;
	for (string::iterator _ = tmp.begin(); _ != tmp.end(); ++_)if (*_ == ' ') {
			if (t != "")v.push_back(t);
			t = "";
		} else t += *_;
	if (t != "")v.push_back(t);
	t = "";
	for (vector<string>::iterator _ = v.begin(); _ != v.end(); ++_) {
		tmp = *_;
		if (tmp == "&") {
			node *tmpp;
			if (root -> opt == shi)tmpp = root;
			else tmpp = newp();
			tmpp -> p = shiptr;
			tmpp -> opt = AND;
			node *x, *y;
			x = sk.top();
			sk.pop();
			y = sk.top();
			sk.pop();
			tmpp -> ls = x;
			tmpp -> rs = y;
		} else if (tmp == "|") {
			node *tmpp;
			if (root -> opt == shi)tmpp = root;
			else tmpp = newp();
			tmpp -> p = shiptr;
			tmpp -> opt = OR;
			node *x, *y;
			x = sk.top();
			sk.pop();
			y = sk.top();
			sk.pop();
			tmpp -> ls = x;
			tmpp -> rs = y;
			sk.push(tmpp);
		} else if (tmp == "!") {
			node *tmpp;
			tmpp = sk.top();
			sk.pop();
			tmpp->tag = !tmpp->tag;
			sk.push(tmpp);
		} else {
			int k = 0;
			for (int i = 1; i < tmp.size(); ++i)k = k * 10 + (tmp[i] ^ 48);
			num number;
			node *tmpp;
			if (root -> opt == shi)tmpp = root;
			else tmpp = newp();
			tmpp -> p = &number;
			number.id = k;
			tmpp->opt = NUM;
			sk.push(tmpp);
		}
	}
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		int tmp;
		cin >> tmp;
		if (tmp)a[i] = true;
		else a[i] = false;
	}
	int q;
	cin >> q;
	while (q--) {
		int x;
		cin >> x;
		a[x] = !a[x];
		cout << dfs(sk.top());
		a[x] = !a[x];
	}
	return 0;
}
2024/4/16 18:57
加载中...