[HNOI2012] 永无乡
Description
永无乡包含 $n$ 座岛,编号从$1 $到$ n$,每座岛都有自己的独一无二的重要度,按照重要度可 以将这$ n $座岛排名,名次用 $1 $到 $n $来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含$ 0 $座)桥可以到达岛$ b$,则称岛$ a $和岛$ b $是连 通的。
现在有两种操作:
- B x y 表示在岛 x 与岛 y 之间修建一座新桥。
- Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪座,请你输出那个岛的编号。
Input
输入文件第一行是用空格隔开的两个正整数 $n $和 $m$,分别 表示岛的个数以及一开始存在的桥数。接下来的一行是用空格隔开的$ n $个数,依次描述从岛$ 1 $到岛$ n $的重要度排名。随后的 $m $行每行是用空格隔开的两个正整数 $a_i $和 $bi$,表示一开始就存 在一座连接岛$ ai $和岛$ bi $的桥。后面剩下的部分描述操作,该部分的第一行是一个正整数$ q$, 表示一共有$ q $个操作,接下来的 $q$ 行依次描述每个操作,操作的格式如上所述,以大写字母 Q 或B 开始,后面跟两个不超过$ n $的正整数,字母与数字以及两个数字之间用空格隔开。
对于$ 20$%的数据$ n≤1000,q≤1000 $
对于$ 100$%的数据 $n≤100000,m≤n,q≤300000 $
Output
对于每个 Q x k 操作都要依次输出一行,其中包含一个整数,表 示所询问岛屿的编号。如果该岛屿不存在,则输出-1。
Sample Input
|
|
Sample Output
|
|
题解
题目要求维护的是无向图的连通性和没个连通块的第$k$大。考虑最裸的维护无向图连通性和第$k$大的工具,就是并查集和平衡树。
考虑对于并查集中的每一个集合构建一颗平衡树,那么对于平衡树的合并,最差情况下,依次合并的话会退化为$O(n^2logn)$的复杂度。对于两个大小为$a\leq b$的平衡树,自然的想法是把$a$插入到$b$中,那么插入的个数是$O(a)$,是要小于$O(b)$的。事实上可以证明,这样插入均摊下来整体的复杂度是$O(nlogn)$的,那么这个算法就是正确的。通过重复利用结点,空间复杂度为$O(n)$。
|
|
而还有一种可以维护第$k$大的工具就是权值线段树。对于线段树的合并由于维护的是权值关系,每次新建节点的话,会导致空间复杂度退化为$O(n^2)$,而事实上最开始的空间复杂度,对于每个连通块都是一个单点,想要访问这个节点的信息只需要$O(logn)$个结点,所以采用我们每次只添加有用的点,类似于主席树后续版本的插入一样。对于需要的结点再分配空间。可以证明空间复杂度是$O(logn)$的,而每次对于每一层信息合并即可,一共有$O(logn)$层,复杂度也是$O(logn)$的。
|
|