1523 : 绝对武力:破碎的战术网络

时间限制Time Limit 1 Sec 内存限制Memory Limit 256 MB 提交次数Submitted 0 Times 通过次数Solved 0 Times 标准评测Standard Judge

题目描述Description

在一个可容纳海量玩家的 CS:GO 社区服务器中,玩家们为了执行战术,会通过无线电建立战术语音网络。这种语音通信具有对称性传递性:如果玩家 A 与玩家 B 连麦,且玩家 B 与玩家 C 连麦,那么 A, B, C 就会在底层路由的桥接下处于同一个语音频道(即同一个等价类)中,可以无障碍地共享情报。

然而,服务器的网络极不稳定,经常有玩家遭遇“物理断网(Disconnect)”。当某个玩家发生物理断网时,他的客户端会瞬间切断与当前所在语音频道内所有其他玩家的连接,变成一个完全孤立的单机状态(相当于被丢进了虚空频道)。 特别注意:断网仅对发生故障的单名玩家生效,原语音频道中剩余的其他玩家相互之间的通信路由依然完好,不受该玩家掉线的影响。

服务器初始有 N 名相互独立、没有组队的玩家,编号为 1N。 你需要编写一个后台监控脚本,处理 Q 次服务器日志事件。事件共分为以下四种类型:

  • 1 u v (建立连麦):玩家 uv 建立无线电连接,使他们所在的两个语音频道合并为一个更大的频道。若 uv 已经处于同一个语音频道中,则此操作无效(忽略)。

  • 2 u (物理断网):玩家 u 的网络发生中断(Disconnect)。玩家 u 将从他当前的语音频道中彻底脱离,成为一个仅包含他自身的全新独立状态。原频道中其余玩家彼此之间的连接保持不变。若 u 当前已经处于孤立状态(即频道中只有他自己),则此断网事件不改变任何状态。

  • 3 u v (无线电测试):发送测试数据包,询问玩家 uv 当前是否处于同一个语音频道中(即能否互相听见对方说话)。

  • 4 u (频道盘点):询问玩家 u 当前所在的语音频道中,共包含多少名玩家(包含 u 自身)。频道人数越多,信息交换的效率越高。

输入格式Input

第一行包含两个正整数 NQ,分别表示初始玩家的数量和服务器事件的总次数。

接下来 Q 行,每行描述一次事件。每行的第一个整数 op 代表事件类型(1 \le op \le 4):

  • op = 1,接下来有两个整数 u, v,表示建立连麦操作。

  • op = 2,接下来有一个整数 u,表示物理断网操作。

  • op = 3,接下来有两个整数 u, v,表示无线电测试操作。

  • op = 4,接下来有一个整数 u,表示频道盘点操作。

输出格式Output

对于每一次无线电测试操作(op = 3),如果玩家 uv 处于同一个语音频道中,输出一行 Yes;否则输出一行 No

对于每一次频道盘点操作(op = 4),输出一行一个整数,表示该语音频道包含的玩家总数。

样例Sample

提示Hint

【样例 1 解释】

  1. 1 1 2:玩家 1 和 2 连麦。频道状态:\{1, 2\}, \{3\}, \{4\}, \{5\}
  2. 1 2 3:玩家 2 和 3 连麦,由于路由桥接,1, 2, 3 处于同一频道。频道状态:\{1, 2, 3\}, \{4\}, \{5\}
  3. 1 4 5:玩家 4 和 5 连麦。频道状态:\{1, 2, 3\}, \{4, 5\}
  4. 3 1 3:测试玩家 1 和 3 是否在同一频道,他们同处于频道 \{1, 2, 3\},输出 Yes
  5. 4 1:询问玩家 1 所在频道的玩家数,包含 1, 2, 3,输出 3
  6. 2 2:玩家 2 遭遇物理断网,被迫掉线脱离原频道。注意:玩家 1 和 3 之间的通信路由不受影响,继续保持连通。 频道状态更新为:\{1, 3\}, \{2\}, \{4, 5\}
  7. 3 1 3:测试玩家 1 和 3 是否在同一频道,输出 Yes
  8. 3 1 2:测试玩家 1 和 2 是否在同一频道,输出 No
  9. 4 1:询问玩家 1 所在频道的玩家数,目前只有 1 和 3 在该频道,输出 2
  10. 4 2:询问玩家 2 所在频道的玩家数,掉线后频道里只有他自己,输出 1
  11. 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

深圳技术大学第六届程序设计竞赛