刚学OI五分钟!!90pts分求助!!!
查看原帖
刚学OI五分钟!!90pts分求助!!!
109634
Cyber_Tree楼主2020/11/23 17:45
#include<bits/stdc++.h>
using namespace std;
char a[1000010];
int ul[1000010],num[1000010];
bool fAKe[1000010],vis[1000010];
int n,m;
int cnt,ct;
int head[1000010];
struct emm{
	int t,nxt;
}l[2000010];
void add(int a,int b){
	l[++ct].nxt=head[a];
	l[ct].t=b;
	head[a]=ct;
	return;
}
int stn[1000010],tpn;
int re,su,su0;
void dfs(int u){
	vis[u]=1;
	for(int i=head[u];i;i=l[i].nxt){
		int t=l[i].t;
		if(vis[t]) continue;
		else dfs(t);
	}
}
int main(void){
	gets(a+1);
	int len=strlen(a+1);
	for(int i=1;i<=len;i++){
		if(a[i]=='!') ul[++cnt]=-3;
		else if(a[i]=='|') ul[++cnt]=-2;
		else if(a[i]=='&') ul[++cnt]=-1;
		else if(a[i]==' ') continue;
		else if(a[i]=='x'){
			cnt++;
			int x=0;
			++i;
			while(a[i]!=' '){
				x=x*10+(a[i]-'0');
				++i;
			}
			num[x]=cnt;
		}
	}
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&m);
		ul[num[i]]=m;
	}
	for(int i=1;i<=cnt;i++){
		if(ul[i]>=0){
			stn[++tpn]=i;
			continue;
		}
		if(ul[i]==-3){
			ul[stn[tpn]]+=1;
			ul[stn[tpn]]%=2;
		}else if(ul[i]==-2){
			tpn--;
			if(ul[stn[tpn]]==ul[stn[tpn+1]]&&ul[stn[tpn+1]]==1)fAKe[stn[tpn]]=1;
			if(ul[stn[tpn]]==0&&ul[stn[tpn+1]]==0&&!fAKe[stn[tpn+1]]) add(stn[tpn],stn[tpn+1]);
			else if(ul[stn[tpn]]==0) swap(stn[tpn],stn[tpn+1]);
		}else if(ul[i]==-1){
			tpn--;
			if(ul[stn[tpn]]==0&&ul[stn[tpn+1]]==0) fAKe[stn[tpn]]=1;
			if(ul[stn[tpn]]==1&&ul[stn[tpn+1]]==1&&!fAKe[stn[tpn+1]]) add(stn[tpn],stn[tpn+1]);
			else if(ul[stn[tpn]]==1) swap(stn[tpn],stn[tpn+1]);
		}
	}
	re=stn[tpn];
	su=ul[re];
	su0=(su+1)%2;
	if(!fAKe[re]) dfs(re);
	scanf("%d",&m);
	int x;
	for(int i=1;i<=m;i++){
		scanf("%d",&x);
//		printf("-->%d\n",num[x]);
		if(vis[num[x]]&&!fAKe[num[x]]){
			printf("%d\n",su0);
		}else printf("%d\n",su);
	}
	return 0;
}

第六个点和第十四个点被Wonderful Answer了,但是并没有找到任何bug,也没有发现任何可以将代码证伪的反例。。。

求奆老 Hack || 帮查下bug。。。

2020/11/23 17:45
加载中...