ダンジョン2
题意翻译
## 题目背景
这是一道**交互题**。此处仅支持 C++ 提交。
## 题目描述
ngg 君正在玩一个地牢探索游戏。
地牢的结构是一个 $n$ 个点,$m$ 条边,无重边,无自环,联通的无向图。**你并不知道地牢的结构**。
对于每个节点 $x$,设其有 $c_x$ 条出边,则其每条出边都有一个编号,为 $[1,c_x]$ 的整数,同一节点每条出边编号互不相同,且固定不变。
每个节点 $x$ 上有一个数字 $num_x$。初始时所有 $num_x=1$。每当你通过某一出边离开节点 $x$ 时,你都可以把 $num_x$ 改为 $[1,X]$ 的任意整数。
为了速通游戏,你需要告诉 ngg 君,对于每个 $1\leq d\leq R$,有多少个**无序**点对 $(x,y)$ 满足 $x$ 到 $y$ 的最短路距离为 $d$。
## 实现细节
请确保你的程序开头有 `#include "dungeon2.h"`。
头文件 `dungeon2.h` 中实现了如下内容:
- 你可以调用函数:
```cpp
void Answer(int D, int A);
void Move(int I, int C);
int NumberOfRoads();
int LastRoad();
int Color();
```
- `Answer` 函数中:
- 调用此函数表示“回答 $d=D$ 时的答案为 $A$”。
- $D$ 必须是 $[1,R]$ 中的整数,若不满足,会被交互库判断 `Wrong answer [1]`。
- 同一个 $D$ 只能被调用一次,若不满足,会被交互库判断 `Wrong answer [2]`。
- 此函数恰好被调用 $R$ 次,若不满足,会被交互库判断 `Wrong answer [3]`。
- 若 $A$ 与正确答案不符,会被交互库判断 `Wrong answer [4]`。
- 若被判断为以上四条的任意一条,程序将被终止。
- `Move` 函数中:
- 令当前节点为 $x$,调用此函数表示你操控 ngg 君通过 $x$ 的第 $I$ 条出边离开 $x$,随后将 $num_x$ 赋值为 $C$。
- $I$ 必须是 $[1,c_x]$ 中的正整数,若不满足,会被交互库判断 `Wrong answer [5]`。
- $C$ 必须是 $[1,X]$ 中的正整数,若不满足,会被交互库判断 `Wrong answer [6]`。
- 此函数至多被调用 $1.5\times 10^6$ 次,若不满足,会被交互库判断 `Wrong answer [7]`。
- `NumberOfRoads` 函数会返回当前节点(设为 $x$)的 $c_x$。
- `LastRoad` 函数会返回上一次你走的边,**对于当前节点来说** 的编号。
- 若当前没有进行过 `Move` 操作,返回 `-1`。
- `Color` 函数会返回当前节点(设为 $x$)的 $num_x$。
**你不需要,也不应该实现主函数。** 你需要实现如下函数:
```cpp
void Inspect(int R);
```
此函数会被交互库调用恰好一次。
$R$ 表示你需要对 $d\in[1,R]$ 的整数进行回答。
初始时,ngg 君的位置为 $1$ 号节点。
## 测试程序方式
附件中包含一个样例交互器 `grader.cpp` 和交互库 `dungeon2.h`。
编译 grader.cpp 需执行如下命令:
``g++ -std=c++11 -O2 -o grader grader.cpp dungeon2.cpp``
你需要实现的是 `dungeon2.cpp`。
按上述方法编译得到的可执行文件 `grader`,其运行方式如下:
- 可执行文件将从标准输入读入以下格式的数据:
- 第一行三个正整数 $n,X,R$。
- 接下来 $2n$ 行,每 $2$ 行中,先读入一行一个正整数 $c_i$,接下来一行 $c_i$ 个正整数 $T_{i,j}$,表示通过编号为 $j$ 的出边可以从 $i$ 节点到达 $T_{i,j}$ 节点。
- 接下来 $R$ 行每行一个整数 $A_i$,表示标准答案。
- 读入之后,交互库会进行测试,其输出如下:
- 若答案正确,输出 `Move` 函数调用的次数,如 `Accepted : #move = 8`。
- 如果不正确,输出错误的类型,如 `Wrong answer [1]`。
## 输入样例
```
4 3 3
1
2
3
1 3 4
2
2 4
2
2 3
4
2
0
```
## 示例交互过程
$$\begin{array}{|c|c|}
\hline \text{函数调用} & \text{返回值}\\
\hline \mathrm{Inspect(3)} & / \\
\hline \mathrm{NumberOfRoads()} & 1\\
\hline \mathrm{LastRoad()} & -1\\
\hline \mathrm{Move(1, 2)} & / \\
\hline \mathrm{Color()} & 1 \\
\hline \mathrm{LastRoad()} & 1 \\
\hline \mathrm{NumberOfRoads()} & 3 \\
\hline \mathrm{Move(1, 3)} & / \\
\hline \mathrm{Color()} & 2 \\
\hline
\mathrm{Answer(1, 4)} & / \\
\hline
\mathrm{Answer(2, 2)} & / \\
\hline
\mathrm{Answer(3, 0)} & / \\
\hline
\end{array}$$
## 数据范围
- $2\leq n\leq 200,1\leq R\leq 200$。
- $X=3$ 或 $X=100$。
- $1\leq c_i<n$。
- $T_{i,j}\leq n,T_{i,j}\ne i,T_{i,j1}\ne T_{i,j2}(j1\ne j2)$。
- 保证存在 $T_{T_{i,j},k}=i$。
图的总边数 $m=\dfrac{\sum_{i=1}^nc_i}{2}$。
子任务 $1$:$n\leq 50,m\leq 100,X=100$。
子任务 $2$:$n\leq 50,m\leq 100,X=3$。
子任务 $3$:$n\leq 200,X=3$。
## 评分标准
若子任务 $1$ 答案正确,得 $17$ 分,否则不得分。
若子任务 $2$ 答案正确,得 $27$ 分,否则不得分。
若子任务 $3$ 答案不正确,不得分,否则:
- 令 $C$ 表示 `Move` 函数调用次数,$L$ 表示 $\dfrac{C}{m}$,则得分为:
$$\begin{cases}
56 & L\leq 14\\
\left\lfloor70-L\right\rfloor & 14<L\leq 32\\
\left\lfloor54-\dfrac{L}{2}\right\rfloor & 32<L\leq 64\\
0 & 64<L
\end{cases}$$
## 交互文件
[在此处查看。](https://www.luogu.com.cn/paste/gkdz2iud)
题目描述
[problemUrl]: https://atcoder.jp/contests/joisc2016/tasks/joisc2016_g
配布ファイルは [こちら](https://www.ioi-jp.org/camp/2016/2016-sp-tasks/index.html) .
C++ を使用する場合は問題文の指示に従ってください.
このジャッジは C++ 以外に対応していません.