#icpc2013summerday4e. [icpc2013summer_day4_e]Optimal alpha beta pruning

[icpc2013summer_day4_e]Optimal alpha beta pruning

问题描述

抱歉,问题已经被修改。(12:51 JST)

Fox Ciel正在开发一个游戏的人工智能(AI)。这个游戏可以描述为一个有n个顶点的游戏树T。游戏中的每个节点都有一个评估值,用于显示当前情况的好坏程度。这个值等于子节点值的最大值乘以-1。叶节点上的值是由Ciel的特殊函数评估得出的 - 这个函数的计算比较复杂。因此,她打算使用Alpha-Beta剪枝来获取根节点的评估值,以减少需要计算的叶节点数。

顺便说一下,改变子节点的评估顺序会影响叶节点的计算次数。因此,Ciel想要知道在能够按任意顺序评估子节点时,在叶节点上计算的最小和最大次数。她请你计算最小评估次数和最大评估次数。

添加伪代码。(13:17 JST)
Ciel使用以下算法:


function negamax(node, α, β)
    if node是终止节点
        返回叶节点的值
    否则
        对于node的每个子节点
            val := -negamax(child, -β, -α)
            如果val >= β
                返回val
            如果val > α
                α := val
        返回α

[注] 负最大值算法


输入

输入遵循以下格式:

nn p1p_1 p2p_2 ... pnp_n k1k_1 t11t_{11} t12t_{12} ... t1kt_{1k} : : knk_n tn1t_{n1} tn2t_{n2} ... tnkt_{nk}

第一行包含整数nn,表示游戏树T中的顶点数。
第二行包含nn个整数pip_i,表示顶点ii的评估值。
接下来的nn行包含游戏树T的信息。
kik_i是顶点ii的子节点数量,tijt_{ij}是顶点ii的子节点的索引。
输入满足以下约束条件:

  • 2n1002 \leq n \leq 100

  • \-10,000pi10,000\-10,000 \leq p_i \leq 10,000

  • 0ki50 \leq k_i \leq 5

  • 2tijn2 \leq t_{ij} \leq n

  • 根节点的索引为1。

  • 除了叶节点外,评估值始终为0。这并不意味着非叶节点的评估值为0,如果需要的话,你必须计算它们。

  • 叶节点有时具有评估值为0的情况。

  • 游戏树T是一棵树结构。

输出

打印最小评估次数和最大评估次数的叶节点。
请在最小值和最大值之间用空格分开。


最小值 最大值```

* * *

### 示例输入1

```plain
3
0 1 1
2 2 3
0
0

示例输入1的输出

2 2

示例输入2

8
0 0 100 100 0 -100 -100 -100
2 2 5
2 3 4
0
0
3 6 7 8
0
0
0

示例输入2的输出

3 5

示例输入3

8
0 0 100 100 0 100 100 100
2 2 5
2 3 4
0
0
3 6 7 8
0
0
0

示例输入3的输出

3 4

示例输入4

19
0 100 0 100 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10
2 2 3
0
2 4 5
0
3 6 7 8
3 9 10 11
3 12 13 14
3 15 16 17
2 18 19
0
0
0
0
0
0
0
0
0
0

示例输入4的输出

7 12

来源名称

Summer Camp 2013