链接:Codeforces 1010D - Mars rover
大意:有一个由n个与门(AND)、或门(OR)、异或门(XOR)、非门(NOT)和输入端口(IN)组成的电路,门1的结果为输出(即门1为根节点)。给你各个门之间的连接路线,以及输入端口的初始输入,求当每个输入端口的输入值变化(其他端口输入值不变)时,对应输出的结果。(2<=n<=1e6)
思路:先进行一次DFS得到门1初始状态下的输出。再进行一次DFS,求出对于当前节点,当其儿子节点的值发生变化时(其他节点值不变),是否会导致门1的结果发生变化,再遍历所有输入端口,输出对应结果即可。
代码:
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct scheme
{
char type;
bool value, influence;
int father;
int son[2];
}schemes[1000001];
bool dfs(int ord)
{
switch (schemes[ord].type)
{
case 'A':
schemes[ord].value = dfs(schemes[ord].son[0]) & dfs(schemes[ord].son[1]);
break;
case 'O':
schemes[ord].value = dfs(schemes[ord].son[0]) | dfs(schemes[ord].son[1]);
break;
case 'X':
schemes[ord].value = dfs(schemes[ord].son[0]) ^ dfs(schemes[ord].son[1]);
break;
case 'N':
schemes[ord].value = !dfs(schemes[ord].son[0]);
break;
default:
break;
}
return schemes[ord].value;
}
void dfs2(int ord)
{
int father = schemes[ord].father;
if (!schemes[ord].father)
schemes[ord].influence = true;
else
{
if (schemes[father].influence)
{
switch (schemes[father].type)
{
case 'A':
if (schemes[father].son[0] == ord ? schemes[schemes[father].son[1]].value : schemes[schemes[father].son[0]].value)
schemes[ord].influence = true;
else
schemes[ord].influence = false;
break;
case 'O':
if (schemes[father].son[0] == ord ? schemes[schemes[father].son[1]].value : schemes[schemes[father].son[0]].value)
schemes[ord].influence = false;
else
schemes[ord].influence = true;
break;
case 'X':
schemes[ord].influence = true;
break;
case 'N':
schemes[ord].influence = true;
break;
default:
break;
}
}
else
schemes[ord].influence = false;
}
switch (schemes[ord].type)
{
case 'A':
case 'O':
case 'X':
dfs2(schemes[ord].son[0]);
dfs2(schemes[ord].son[1]);
break;
case 'N':
dfs2(schemes[ord].son[0]);
break;
default:
break;
}
return;
}
int main()
{
int n;
char type[4];
vector<int> input;
while (scanf("%d", &n) != EOF)
{
input.clear();
memset(schemes, 0, sizeof(schemes));
for (int i = 1; i <= n; i++)
{
int x, y;
scanf("%s", type);
schemes[i].type = type[0];
switch (type[0])
{
case 'A':
scanf("%d %d", &x, &y);
schemes[x].father = i;
schemes[y].father = i;
schemes[i].son[0] = x;
schemes[i].son[1] = y;
break;
case 'O':
scanf("%d %d", &x, &y);
schemes[x].father = i;
schemes[y].father = i;
schemes[i].son[0] = x;
schemes[i].son[1] = y;
break;
case 'X':
scanf("%d %d", &x, &y);
schemes[x].father = i;
schemes[y].father = i;
schemes[i].son[0] = x;
schemes[i].son[1] = y;
break;
case 'N':
scanf("%d", &x);
schemes[x].father = i;
schemes[i].son[0] = x;
break;
default:
scanf("%d", &x);
schemes[i].value = x;
input.push_back(i);
break;
}
}
dfs(1);
dfs2(1);
int sizes = input.size();
for (int i = 0; i < sizes; i++)
printf("%d", schemes[input.at(i)].influence ? !schemes[1].value : schemes[1].value);
printf("\n");
}
return 0;
}