UOJ Logo Universal Online Judge

UOJ

#751. 【UNR #6】神隐

附件下载 统计

这是一道交互题。

hehe 蚤决定花费几天时间,游览下山市的最著名的旅游景点 —— 吓山。

吓山,以高低纵横,崔巍秀丽,错综复杂的地形闻名。据说无论用什么地图导航,都不能保障你在山中不迷路。

之所以会出现这样的情况,是因为吓山中的路,在没有光的时候都会发生 “神隐”。在“神隐”状态下,人们无法察觉到这条路的存在,很容易就迷路了。

吓山的地图可以简化为一个 n 个节点,编号为 0n1 的树。它有 n1 条边,其中第 i 条边为 (ui,vi)0i<n1)。每条路上都装有路灯。

为了攻略吓山,hehe 蚤和它的小伙伴们试图绘制吓山的地图。

  1. hehe 蚤事先从吓山管理员那里拿到了吓山每条路的路灯的控制权。hehe 蚤会进行若干次询问,每次询问时 hehe 蚤都会打开一部分路的路灯,并关闭剩下的路灯。当一条路上的路灯打开时,这条路就真实存在;当路灯关闭时,这条路就会 “神隐”,等效于不存在。
  2. 对于每个询问,hehe 蚤的小伙伴们都会进行一番实地考察,告诉 hehe 蚤吓山在当前状态下的哪些节点是可以通过道路相互连通的。
  3. 最后 hehe 蚤会根据询问结果总结出一份地图,即恢复出这棵树的形态。

为了更高效地解决问题,hehe 蚤将其抽象为了一道交互题。有一棵未知的树,你需要对交互库进行若干次询问,来恢复这棵树的形态。每次询问时,你需要给出一个长度为 n101 向量 A,然后交互库会将每条满足 Ai=1 的边 (ui,vi) 加入一张新的空图 G 中,并返回其中每一个连通块(再删除这个图)。最后,你需要输出这棵树的所有边(顺序、方向任意)。

任务

本题仅支持符合 C++ 11 标准及以上的 C++ 语言。

你必须引用 tree.h

你需要实现下面的过程:

std::vector<std::pair<int, int>> solve(int n);

这个过程会被恰好调用一次。

其中 n 为树的节点数量,你需要返回这棵树的所有边,边的顺序、方向任意。

你可以调用以下函数:

std::vector<std::vector<int>> query(std::vector<int> vec);

你需要保证 vec 是个 01 向量,且长度为 n1

它会返回在一张空图加入指定边后的所有连通块,每个连通块以 std::vector<int> 存储,再将所有连通块用 std::vector 存储返回。

这个函数至多被调用 limit 次。

评测方式

样例评测库将读入如下格式的输入数据:

第一行两个整数 n,limit

接下来 n1 行,每行两个整数 ui,vi 表示树的一条边。

样例评测库将输出如下格式的输出数据:

如果你的返回结果错误或交互过程不合法,则评测库会输出 Wrong Answer 并输出错误原因。

否则输出两行,第一行为 Accepted!,第二行输出你使用 query 的次数。

交互式类型的题目怎么本地测试

最终测试中,树是确定的,不会因为你的询问而改变,并且最终评测库与下发评测库仅有反作弊上的差别。

样例一

input

5 22
0 3
0 2
1 0
4 2

output

Accepted!
0 calls

样例二

见附件下载中的 ex_tree2.inex_tree2.ans,该样例服从子任务二的限制。

样例三

见附件下载中的 ex_tree3.inex_tree3.ans,该样例服从子任务四的限制。

数据范围与提示

子任务编号 n limit= 分值
1 7 22 10
2 2000 22 20
3 2000 14 20
4 131072 34 20
5 131072 20 30

对于所有数据(包含 hack 数据):

1n131072,limit34

如果 n2000,则 limit14

否则 limit20

保证合法的交互过程中,交互库不会使用超过 0.5s 的时间和 32MB 的空间。

时间限制:3s

空间限制:512MB