#P13466. [GCJ 2008 #2] Cheating a Boolean Tree
[GCJ 2008 #2] Cheating a Boolean Tree
Description
在本题中,我们将考虑一种称为布尔树的二叉树。在这种树中,除了最后(最深)一层外,每一层都被完全填满,并且最后一层的节点尽可能靠左。此外,树中的每个节点要么有 个子节点,要么有 个子节点。
布尔树的特殊之处在于,每个节点都与一个布尔值相关联,取 或 。此外,每个内部节点都与一个“AND”或“OR”门相关联。一个“AND”门节点的值由其两个子节点的值进行逻辑与运算得到。同理,“OR”门节点的值由其两个子节点的值进行逻辑或运算得到。所有叶子节点的值将作为输入给出,因此可以自底向上计算所有节点的值。
我们特别关注树的根节点。我们希望根节点的值为 ,即 或 。不幸的是,根节点的实际值可能并非如此。幸运的是,我们可以作弊,将某些节点的门类型进行更改;即可以将 AND 门改为 OR 门,或将 OR 门改为 AND 门。
给定一个布尔树的描述以及哪些门可以更改,求最少需要更改多少个门,才能使根节点的值为 。如果无法实现,则输出 "IMPOSSIBLE"(带引号,仅为清晰起见)。
Input Format
输入的第一行包含测试用例数 。接下来有 个测试用例。
每个测试用例以 和 开头。 表示树中节点的数量,且 为奇数,以确保所有节点要么有 个子节点,要么有 个子节点。 是根节点期望的值,取 或 。
接下来的 行描述树中每个节点。第 行描述编号为 的节点,节点编号从 开始。
前 行描述内部节点。每行包含 和 ,均为 或 。若 为 ,则该节点为 AND 门,否则为 OR 门。若 为 ,则该门类型可以更改,否则不可更改。内部节点 的两个子节点分别为 和 。
接下来的 行描述叶子节点。每行包含一个值 ,为 或 ,表示该叶子节点的值。
为帮助理解,以下是第一个样例输入对应的树结构图:

Output Format
对于每个测试用例,输出:
Case #X: Y
其中 是测试用例编号, 是使根节点输出为 所需更改门的最小次数;如果无法实现,则输出 "IMPOSSIBLE"(带引号,仅为清晰起见)。
2
9 1
1 0
1 1
1 1
0 0
1
0
1
0
1
5 0
1 1
0 0
1
1
0
Case #1: 1
Case #2: IMPOSSIBLE
Hint
样例说明
在第 1 个测试用例中,我们可以将节点 3 的门更改为 OR 门,从而使根节点达到期望的结果。
在第 2 个测试用例中,只有根节点可以更改,但将其改为 OR 门也无法实现目标。
数据范围
小数据集(5 分,测试点 1 - 可见)
大数据集(10 分,测试点 2 - 隐藏)
由 ChatGPT 4.1 翻译
京公网安备 11011102002149号