这是一道交互题。
新首都跳蚤利亚需要建立地铁线路!hehe 蚤负责了这个项目。
跳蚤利亚有
由于跳蚤利亚是面向未来的节能环保城市,hehe 蚤希望地铁的建设也要避免浪费。hehe 蚤仔细地审查工程建设方案,并定义了什么叫做“绿色区间”:对于任何满足
hehe 蚤突然好奇:有多少个区间
作为跳蚤国顶级科学家之一,hehe 蚤刚在大量系统中植入了 hehe 树,所以这问题已经变得没意思了。为了挑战自我,hehe 蚤拿出了一台植入 hehe 树失败的机器,仅包含部分 hehe 树功能。具体来说,这台机器支持:
给定
,在图中建立双向线路 ,注意,如果假如建立后图中产生了环,机器会报错。拆除图中加入时间最晚的一条双向线路。
给定
,询问 两点间是否可以通过已经建立的双向线路连通。
拿出了这台机器后,hehe 蚤又得出了一个基于分治的强大的做法,并给出了答案。hehe 蚤大呼简单。
但 hehe 蚤又想了想,觉得自己应该在跳蚤国内弘扬这股 “麻烦自己,麻烦别人” 的挑战精神。于是 hehe 蚤把这台机器交给了你。他会从小到大依次对每个左端点
一句话题意:有一个长度为
任务
本题仅支持 C++。
你必须引用 subway.h
头文件。
你需要实现下面的过程:
void init(int n, int m, int lim);
这个过程将在所有 solve
调用前,恰好被调用一次。
其中 merge
次数的上限。
int solve(int l);
这个过程将被调用恰好 l
一定是
你可以在 solve
的过程中调用以下过程和交互库交互:
void merge(int x);
这个函数的作用是建立双向线路
这个函数只能在 solve
过程中被调用,并且必须满足 solve
过程的参数,以及加入这条边不会使 hehe 树维护的图成环,否则你的交互过程会被判定为失败。
你调用这个函数的次数不能超过
void undo();
这个函数将撤销最后一次没有被撤销的 merge
操作,如果没有可以被撤销的 merge
操作,你的交互过程会被判定为失败。
bool check(int x);
如果 false
,否则返回 true
。
换言之,返回值表示加入第
不同 solve
轮次间 hehe 蚤维护的图将被保留,并且初始不包含任何边。
评测方式
样例评测库将读入如下格式的输入数据:
第一行包括三个正整数
接下来
样例评测库将输出如下格式的输出数据:
对于每一组数据,如果你交互过程合法,交互库将输出 Success
或 Too many merge
,并在第二行输出你调用 merge
的次数,第三行输出你求出的答案,否则会输出 Wrong Answer [id]
,你可以查阅样例评测库来确定错误类型。
最终测试中,线路序列是确定的,不会因为你的询问而改变。
样例
input
4 4 1000 1 2 2 3 3 4 4 2
output
Success Count of merge: 6 3 3 4 4
explanation
以下是一个合法的交互过程。
交互库调用 | 选手调用 | 返回 | 并查集状态 |
---|---|---|---|
init(4, 4, 1000) |
|||
solve(1) |
|||
merge(1) |
|||
check(2) |
true |
||
merge(2) |
|||
check(3) |
true |
||
merge(3) |
|||
check(4) |
false |
||
solve |
3 |
||
solve(2) |
|||
undo() |
|||
undo() |
|||
undo() |
|||
merge(3) |
|||
merge(2) |
|||
check(4) |
false |
||
solve |
3 |
||
solve(3) |
|||
undo() |
|||
check(4) |
false |
||
merge(4) |
|||
solve |
4 |
||
solve(4) |
|||
solve |
4 |
其中 solve
的返回值均在若干行后的,标注着交互库调用 solve
的行。
数据范围与提示
保证若你的交互过程满足题目限制,且 check
次数不超过
子任务编号 | 特殊性质 | 分值 | |||
---|---|---|---|---|---|
无 | |||||
无 | |||||
数据随机 | |||||
无 |
对于所有数据,
时间限制:
空间限制: