#P13466. [GCJ 2008 #2] Cheating a Boolean Tree

[GCJ 2008 #2] Cheating a Boolean Tree

Description

在本题中,我们将考虑一种称为布尔树的二叉树。在这种树中,除了最后(最深)一层外,每一层都被完全填满,并且最后一层的节点尽可能靠左。此外,树中的每个节点要么有 00 个子节点,要么有 22 个子节点。

布尔树的特殊之处在于,每个节点都与一个布尔值相关联,取 1100。此外,每个内部节点都与一个“AND”或“OR”门相关联。一个“AND”门节点的值由其两个子节点的值进行逻辑与运算得到。同理,“OR”门节点的值由其两个子节点的值进行逻辑或运算得到。所有叶子节点的值将作为输入给出,因此可以自底向上计算所有节点的值。

我们特别关注树的根节点。我们希望根节点的值为 VV,即 1100。不幸的是,根节点的实际值可能并非如此。幸运的是,我们可以作弊,将某些节点的门类型进行更改;即可以将 AND 门改为 OR 门,或将 OR 门改为 AND 门。

给定一个布尔树的描述以及哪些门可以更改,求最少需要更改多少个门,才能使根节点的值为 VV。如果无法实现,则输出 "IMPOSSIBLE"(带引号,仅为清晰起见)。

Input Format

输入的第一行包含测试用例数 NN。接下来有 NN 个测试用例。

每个测试用例以 MMVV 开头。MM 表示树中节点的数量,且 MM 为奇数,以确保所有节点要么有 00 个子节点,要么有 22 个子节点。VV 是根节点期望的值,取 0011

接下来的 MM 行描述树中每个节点。第 XX 行描述编号为 XX 的节点,节点编号从 11 开始。

(M1)/2(M-1)/2 行描述内部节点。每行包含 GGCC,均为 0011。若 GG11,则该节点为 AND 门,否则为 OR 门。若 CC11,则该门类型可以更改,否则不可更改。内部节点 XX 的两个子节点分别为 2X2X2X+12X+1

接下来的 (M+1)/2(M+1)/2 行描述叶子节点。每行包含一个值 II,为 0011,表示该叶子节点的值。

为帮助理解,以下是第一个样例输入对应的树结构图:

Output Format

对于每个测试用例,输出:

Case #X: Y

其中 XX 是测试用例编号,YY 是使根节点输出为 VV 所需更改门的最小次数;如果无法实现,则输出 "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 门也无法实现目标。

数据范围

  • 1<N201 < N \leq 20

小数据集(5 分,测试点 1 - 可见)

  • 2<M<302 < M < 30

大数据集(10 分,测试点 2 - 隐藏)

  • 2<M<100002 < M < 10000

由 ChatGPT 4.1 翻译