Educational Codeforces Round 91 E(启发式合并/并查集)
2022-07-26 21:15 作者:Asunataisiki | 我要投稿
题意:
给出半径为 的
个圆环和
个塔,要求每个塔上圆环的半径始终从底向上递减,一次操作可以将一个塔顶部的若干个盘子移动到另一个塔的顶部,我们定义某一情形下的复杂度为将所有圆环移动到同一个塔上所需要的最小操作数。题目给出
次询问,每次询问时输出当前塔状态的复杂度并合并两个塔上的圆环到同一个塔上。
思路:
首先手动模拟样例之后可以发现,如果我们要移动当前的圆盘 ,那么
和
必须有一个不在跟
同一个塔上面,如果有一个不在同一个塔则代价为1,两个都不在则为2,那么我们的答案就是当前剩下的所有塔中,相邻圆盘编号不在同一个塔上的个数。
那么对于合并操作,如果每次都排序然后暴力检查的话必然直接超时, 那么可以考虑并查集,但是并查集仅能优化合并的操作,并不能避免检查的操作,这样暴力检查的操作复杂度依然是的复杂度,依然超时。注意到我们可以仅考虑要合并的两个塔是否会有相邻编号的圆盘会被放在同一个塔上,因为其他塔上圆盘的相对顺序并没有改变,所以可以用启发式合并的思想,我们可以选择两个塔中
更小的那一个,合并到大的那一个里面去,这样复杂度就是
了