首先考虑没有退群操作该如何做。
如果把每名学生看做一个点,把同一个群里的所有人都用无向边连接,那么题目就是求 111 号学生所在连通块的大小。这显然是并查集的经典应用。于是我们给每个群的学生连接起来求并查集的大小即可。注意并不需要每两个学生都连接一次,会超时。我们可以选择每个群第一个学生为父节点,其他学生全部向父节点连边。
加入删边(即退群)操作后,并查集显然无法做到删边的功能(期待有神犇能搞个可持久化并查集来打脸我bushi)。但是如果我们离线处理询问,将删边操作倒过来,不就是加边了?于是我们将删边操作倒序枚举,每遇到一次删边就反过来加边,同时将答案存起来倒序输出,就可以使用并查集做到了。
注意细节:由于倒序后一开始处理的情况是所有能退群的学生都退群后的,所以我们加边时需要检查:如果当前群里枚举到的这个学生在退群操作中出现过,那么不能把他加入群里。这样有可能第一个学生不能在一开始就被加入群中,因此每个群的父节点应改为第一个加入群的学生。