65分WA求条
查看原帖
65分WA求条
1088876
lijichuan楼主2024/10/20 21:24

如题,有没有大佬能帮帮我啊

提交记录https://www.luogu.com.cn/record/183656605

#include<bits/stdc++.h>
using namespace std;
char sgeet,tp;
long long st[1000005];int top;
bool fians;
long long cnt=100050;
long long n,m;
long long read(int x,char &sgeet){          // cout<<'b';
	sgeet=getchar();       			//	 cout<<ch;
	long long rt=x;
	while(sgeet<='9'&&sgeet>='0'){
		rt*=10;
		rt+=sgeet-'0';
		sgeet=getchar();     		//	 cout<<ch;
	} 								//	cout<<endl;
	
	return rt;
}
struct node{
	int fa;
	bool type; //0 shu              1 suan
				long long num;	    int type1; //0& 1| 2!
									long long l,r;		bool ifcg,ans;
}a[4000005];

void dfs(int p){      //cout<<p<<"  "<<a[p].num<<" "<<a[p].type1<<" "<<a[p].l<<" "<<a[p].r<<endl;
	if(p==0)return;
	if(a[p].type==0){
		return ;
	}
	if(p==cnt){
		a[p].ifcg=1;
	}
	if(a[p].ifcg==0){
		a[a[p].l].ifcg=0;
		a[a[p].r].ifcg=0;
		dfs(a[p].l);
		dfs(a[p].r);
	}
	else{
		if(a[p].type1==0){
			
			if(a[a[p].l].ans==0){
				if(a[a[p].r].ans==0){
					a[a[p].l].ifcg=0;
					a[a[p].r].ifcg=0;
					dfs(a[p].l);
					dfs(a[p].r);
				}
				else{
					a[a[p].l].ifcg=1;
					a[a[p].r].ifcg=0;
					dfs(a[p].l);
					dfs(a[p].r);
				}
			}
			else{
				if(a[a[p].r].ans==0){
					a[a[p].l].ifcg=0;
					a[a[p].r].ifcg=1;
					dfs(a[p].l);
					dfs(a[p].r);
				}
				else{
					a[a[p].l].ifcg=1;
					a[a[p].r].ifcg=1;
					dfs(a[p].l);
					dfs(a[p].r);		
				}
			}
			
		}
		else if(a[p].type1==1){
			
			if(a[a[p].l].ans==0){
				if(a[a[p].r].ans==0){
					a[a[p].l].ifcg=1;
					a[a[p].r].ifcg=1;
					dfs(a[p].l);
					dfs(a[p].r);
				}
				else{
					a[a[p].l].ifcg=0;
					a[a[p].r].ifcg=1;
					dfs(a[p].l);
					dfs(a[p].r);	
				}
			}
			else{
				if(a[a[p].r].ans==0){
					a[a[p].l].ifcg=1;
					a[a[p].r].ifcg=0;
					dfs(a[p].l);
					dfs(a[p].r);
				}
				else{
					a[a[p].l].ifcg=1;
					a[a[p].r].ifcg=1;
					dfs(a[p].l);
					dfs(a[p].r);		
				}
			}
			
		}
		else{
			a[a[p].l].ifcg=1;
			dfs(a[p].l);
		}
	}
	return ;
	
}
bool sgeetsum(int p){
	if(a[p].type==0){
		a[p].ans=a[p].num;
		return a[p].num;
	}
	if(a[p].type1==0){
		a[p].ans=sgeetsum(a[p].l)&sgeetsum(a[p].r);
		return a[p].ans;
	}
	if(a[p].type1==1){
		a[p].ans=sgeetsum(a[p].l)|sgeetsum(a[p].r);
		return a[p].ans;
	}
	if(a[p].type1==2){
		a[p].ans=1-sgeetsum(a[p].l);
		return a[p].ans;
	}
	
}

void ckdfs(int p){
	if(a[p].type==0){
		cout<<'x'<<p<<": "<<a[p].num<<"  cg:"<<a[p].ifcg<<endl;
		return ;
	}
	cout<<'c'<<p<<" ";
	if(a[p].type1==0)cout<<" "<<a[p].l<<'&'<<" "<<a[p].r<<"  t ans:"<<a[p].ans<<"  cg:"<<a[p].ifcg<<endl;
	else if(a[p].type1==1)cout<<" "<<a[p].l<<'|'<<" "<<a[p].r<<"  t ans:"<<a[p].ans<<"  cg:"<<a[p].ifcg<<endl;
	else cout<<" "<<a[p].l<<'!'<<"  t ans:"<<a[p].ans<<"  cg:"<<a[p].ifcg<<endl;
	
	ckdfs(a[p].l);
	if(a[p].r)ckdfs(a[p].r);
}
int main(){
	//freopen("2.in","r",stdin);
	//freopen("2.out","w",stdout);
	
	
	cin>>sgeet;
	st[++top]=read(0,sgeet);       //cout<<'c';
	sgeet=tp;
	while(sgeet!=10){ 
		sgeet=getchar();if(sgeet==10)break;
		while(sgeet==' ')sgeet=getchar();
		if(sgeet==10)break;
		if(sgeet=='x'){
			st[++top]=read(0,sgeet);
			sgeet=tp;
			if(sgeet==10)break;
		}
		else if(sgeet=='&'){       //cout<<"here";
			a[++cnt].type=1;
			a[cnt].type1=0;
			a[cnt].l=st[top--];
			a[a[cnt].l].fa=cnt;
			a[cnt].r=st[top--];
			a[a[cnt].r].fa=cnt;
			st[++top]=cnt;
		}
		else if(sgeet=='|'){
			a[++cnt].type=1;
			a[cnt].type1=1;
			a[cnt].l=st[top--];
			a[a[cnt].l].fa=cnt;
			a[cnt].r=st[top--];
			a[a[cnt].r].fa=cnt;
			st[++top]=cnt;
		}
		else if(sgeet=='!'){
			a[++cnt].type=1;
			a[cnt].type1=2;
			a[cnt].l=st[top--];
			a[a[cnt].l].fa=cnt;
			st[++top]=cnt;
		}
		else {
		//	n=read(sgeet-'0');
			//cout<<int(sgeet)<<"???????????"<<endl;
		}
	}                      //    cout<<'q';
	
	
	
//	cout<<endl<<"st"<<top<<" "<<st[top]<<endl;
	cin>>n;
	 								//cout<<endl<<"!n!"<<n<<endl;
	for(int i=1;i<=n;i++){        
		cin>>a[i].num; 
	}
	
	fians=sgeetsum(cnt);
	
//	ckdfs(cnt);
	
	dfs(cnt);
	
	//ckdfs(cnt); 
	//cout<<fians<<endl;
	//for(int i=1;i<=n;i++){         
	//	cout<<a[i].ifcg<<" ";
	//}            
	
	long long q,fitp;
	cin>>q;												//cout<<fians<<endl;
	for(int i=1;i<=q;i++){
		cin>>fitp;
		if(a[fitp].ifcg)cout<<1-fians<<endl;
		else cout<<fians<<endl;
	}
	return 0;
} 
/*
x1 x2 & x3 |
3
1 0 1

*/
2024/10/20 21:24
加载中...