70pts TLE 求助
查看原帖
70pts TLE 求助
575093
HMR202001楼主2022/10/2 15:39

RT,后六个点T了,我太蒻了,求大佬帮忙看看怎么优化

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
string s;
int n,q,t,cnt;
bool ans;
struct Node{
	bool tag=0,f; //无影响标记,布尔值 
	int bh,ls,rs,fa,ftp; //编号,左儿子,右儿子,父亲,运算符类型 
}tree[5*N],t1,t2;
stack <Node> stk;
int strtonum(string s){
	int x=0;
	for(int i=0;i<s.size();i++){
		x=10*x+s[i]-'0';
	}
	return x;
}
void maketree(){ //后缀表达式建树 
	s+=' ';
	string sub;
	int k,num;
	while(s.size()){
		k=s.find(' ');
		sub=s.substr(0,k);
		s=s.substr(k+1,s.size());
		if(sub.size()==1){
			if(sub[0]=='&'){
				t1=stk.top();
				stk.pop();
				t2=stk.top();
				stk.pop();
				cnt++;
				tree[cnt].bh=cnt;
				tree[cnt].f=t1.f&&t2.f;
				tree[cnt].ls=t1.bh;
				tree[cnt].rs=t2.bh;
				tree[cnt].ftp=1;
				tree[t1.bh].fa=cnt;
				tree[t2.bh].fa=cnt;
				stk.push(tree[cnt]);
			}else if(sub[0]=='|'){
				t1=stk.top();
				stk.pop();
				t2=stk.top();
				stk.pop();
				cnt++;
				tree[cnt].bh=cnt;
				tree[cnt].f=t1.f||t2.f;
				tree[cnt].ls=t1.bh;
				tree[cnt].rs=t2.bh;
				tree[cnt].ftp=2;
				tree[t1.bh].fa=cnt;
				tree[t2.bh].fa=cnt;
				stk.push(tree[cnt]);
			}else{
				t1=stk.top();
				stk.pop();
				cnt++;
				tree[cnt].ftp=3;
				tree[cnt].bh=cnt;
				tree[cnt].f=!t1.f;
				tree[cnt].ls=t1.bh;
				tree[t1.bh].fa=cnt;
				stk.push(tree[cnt]);
			}
		}else{
			sub=sub.substr(1,sub.size());
			num=strtonum(sub);
			tree[num].bh=num;
			stk.push(tree[num]);
		}
	}
}
void solvetag(int x){ //打标记 
	if(x<=n) return;
	if(tree[x].tag){
		tree[tree[x].ls].tag=1;
		tree[tree[x].rs].tag=1;
	}else{
		if(tree[x].ftp==1){
			if(!tree[tree[x].rs].f){
				tree[tree[x].ls].tag=1;
			}
			if(!tree[tree[x].ls].f){
				tree[tree[x].rs].tag=1;
			}
		}
		if(tree[x].ftp==2){
			if(tree[tree[x].rs].f){
				tree[tree[x].ls].tag=1;
			}
			if(tree[tree[x].ls].f){
				tree[tree[x].rs].tag=1;
			}
		}
	}
	solvetag(tree[x].ls);
	solvetag(tree[x].rs);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	getline(cin,s);
	cin>>n;
	cnt=n;
	for(int i=1;i<=n;i++){
		cin>>tree[i].f;
	}
	maketree();
	solvetag(cnt); 
	cin>>q;
	while(q--){
		cin>>t;
		if(tree[t].tag==1) cout<<tree[cnt].f<<endl;
		else cout<<!tree[cnt].f<<endl;
	}
	return 0;
}
2022/10/2 15:39
加载中...