1523 : 绝对武力:破碎的战术网络
题目描述Description
在一个可容纳海量玩家的 CS:GO 社区服务器中,玩家们为了执行战术,会通过无线电建立战术语音网络。这种语音通信具有对称性与传递性:如果玩家 A 与玩家 B 连麦,且玩家 B 与玩家 C 连麦,那么 A, B, C 就会在底层路由的桥接下处于同一个语音频道(即同一个等价类)中,可以无障碍地共享情报。
然而,服务器的网络极不稳定,经常有玩家遭遇“物理断网(Disconnect)”。当某个玩家发生物理断网时,他的客户端会瞬间切断与当前所在语音频道内所有其他玩家的连接,变成一个完全孤立的单机状态(相当于被丢进了虚空频道)。 特别注意:断网仅对发生故障的单名玩家生效,原语音频道中剩余的其他玩家相互之间的通信路由依然完好,不受该玩家掉线的影响。
服务器初始有 N 名相互独立、没有组队的玩家,编号为 1 到 N。 你需要编写一个后台监控脚本,处理 Q 次服务器日志事件。事件共分为以下四种类型:
1 u v(建立连麦):玩家 u 和 v 建立无线电连接,使他们所在的两个语音频道合并为一个更大的频道。若 u 和 v 已经处于同一个语音频道中,则此操作无效(忽略)。2 u(物理断网):玩家 u 的网络发生中断(Disconnect)。玩家 u 将从他当前的语音频道中彻底脱离,成为一个仅包含他自身的全新独立状态。原频道中其余玩家彼此之间的连接保持不变。若 u 当前已经处于孤立状态(即频道中只有他自己),则此断网事件不改变任何状态。3 u v(无线电测试):发送测试数据包,询问玩家 u 和 v 当前是否处于同一个语音频道中(即能否互相听见对方说话)。4 u(频道盘点):询问玩家 u 当前所在的语音频道中,共包含多少名玩家(包含 u 自身)。频道人数越多,信息交换的效率越高。
输入格式Input
第一行包含两个正整数 N 和 Q,分别表示初始玩家的数量和服务器事件的总次数。
接下来 Q 行,每行描述一次事件。每行的第一个整数 op 代表事件类型(1 \le op \le 4):
若 op = 1,接下来有两个整数 u, v,表示建立连麦操作。
若 op = 2,接下来有一个整数 u,表示物理断网操作。
若 op = 3,接下来有两个整数 u, v,表示无线电测试操作。
若 op = 4,接下来有一个整数 u,表示频道盘点操作。
输出格式Output
对于每一次无线电测试操作(op = 3),如果玩家 u 和 v
处于同一个语音频道中,输出一行 Yes;否则输出一行
No。
对于每一次频道盘点操作(op = 4),输出一行一个整数,表示该语音频道包含的玩家总数。
样例Sample
提示Hint
【样例 1 解释】
1 1 2:玩家 1 和 2 连麦。频道状态:\{1, 2\}, \{3\}, \{4\}, \{5\}。1 2 3:玩家 2 和 3 连麦,由于路由桥接,1, 2, 3 处于同一频道。频道状态:\{1, 2, 3\}, \{4\}, \{5\}。1 4 5:玩家 4 和 5 连麦。频道状态:\{1, 2, 3\}, \{4, 5\}。3 1 3:测试玩家 1 和 3 是否在同一频道,他们同处于频道 \{1, 2, 3\},输出Yes。4 1:询问玩家 1 所在频道的玩家数,包含 1, 2, 3,输出3。2 2:玩家 2 遭遇物理断网,被迫掉线脱离原频道。注意:玩家 1 和 3 之间的通信路由不受影响,继续保持连通。 频道状态更新为:\{1, 3\}, \{2\}, \{4, 5\}。3 1 3:测试玩家 1 和 3 是否在同一频道,输出Yes。3 1 2:测试玩家 1 和 2 是否在同一频道,输出No。4 1:询问玩家 1 所在频道的玩家数,目前只有 1 和 3 在该频道,输出2。4 2:询问玩家 2 所在频道的玩家数,掉线后频道里只有他自己,输出1。4 4:询问玩家 4 所在频道的玩家数,包含 4 和 5,输出2。
【数据范围与约定】
对于 100\% 的数据,保证:
1 \le N \le 5 \times 10^5
1 \le Q \le 5 \times 10^5
1 \le u, v \le N
在操作 1 和操作 3 中,u 可以等于 v。
出题Author
szzk
来源Source
深圳技术大学第六届程序设计竞赛