ダンジョン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++ 以外に対応していません.

输入输出格式

输入格式


输出格式


输入输出样例

暂无测试点