求助,在其他网站上能A,在洛谷Wa掉了
查看原帖
求助,在其他网站上能A,在洛谷Wa掉了
111475
doctorZ_楼主2020/11/11 13:42
#include<cstdio>
using namespace std;
const int N=1e6+1000;
int n,cnt,id[N+10],a[N+10];
int ans[N+10];
struct node
{
	int x,ls,rs,fa;
	bool opt,f;
}p[N+10];
int st[N+10],top;
void dfs(int u,int fa)
{
	p[u].fa=fa;
	if(p[u].opt==1)
	{
		p[u].f=a[p[u].x];
		return;
	}
	if(p[u].x==2)
	{
		dfs(p[u].rs,u);
		p[u].f=!p[p[u].rs].f;
	}
	else
	{
		dfs(p[u].ls,u),dfs(p[u].rs,u);
		if(p[u].x==0)
			p[u].f=p[p[u].ls].f&p[p[u].rs].f;
		else
			p[u].f=p[p[u].ls].f|p[p[u].rs].f;
	}
}
bool check(int u){return p[p[u].fa].ls==u?1:0;}
int f[N+10][2],gc[N+10][2],num;
bool solve(int u)
{
	bool res=p[u].f^1;
	num=0;
	while(u!=st[top])
	{
		gc[++num][0]=u,gc[num][1]=res;
		if(f[u][res]!=-1)
		{
			res=f[u][res];
			break;
		}
		int fa=p[u].fa;
		if(p[fa].x==2)
			res=!res;
		else
		{
			if(check(u))
			{
				if(p[fa].x==0)
					res&=p[p[fa].rs].f;
				else
					res|=p[p[fa].rs].f;
			}
			else
			{
				if(p[fa].x==0)
					res&=p[p[fa].ls].f;
				else
					res|=p[p[fa].ls].f;
			}
		}
		u=fa;
	}
	for(int i=1;i<=num;i++)
		f[gc[i][0]][gc[i][1]]=res;
	return res;
}
int main()
{
//	freopen("expr.in","r",stdin);
//	freopen("expr.out","w",stdout);
	char ch;int x;
	while(scanf(" %c",&ch)==1)
	{
		if('0'<=ch&&ch<='9')
			break;
		cnt++;
		p[cnt].opt=(ch=='x');
		if(ch=='x')
		{
			scanf("%d",&x);
			id[x]=cnt,st[++top]=cnt,p[cnt].x=x;
		}
		else
		{
			if(ch=='&'||ch=='|')
			{
				p[cnt].x=(ch=='|');
				p[cnt].ls=st[top-1],p[cnt].rs=st[top];
				top--;
				st[top]=cnt;
			}
			else
				p[cnt].x=2,p[cnt].rs=st[top],st[top]=cnt;
		}
	}
	while(ch!=' '&&ch!='\n')
		n=(n<<1)+(n<<3)+(ch^48),ch=getchar();
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),ans[i]=-1;
	for(int i=1;i<=cnt;i++)
		f[i][0]=f[i][1]=-1;
	dfs(st[top],0);
	int q;
	scanf("%d",&q);
	while(q--)
	{
		scanf("%d",&x);
		if(ans[x]==-1)
			ans[x]=solve(id[x]);
		printf("%d\n",ans[x]);
	}
	return 0;
}
2020/11/11 13:42
加载中...