为什么没人告诉你计算机科学书籍会如此枯燥?!你从中学不到什么进展,你的 BOI 奖牌也变得遥不可及。但等等——谁说你必须堂堂正正地赢得它呢?*
BOI 官员已经提到,任务说明保存在一个秘密金库中,只有科学委员会主席才能打开。因此,这些说明是你无法触及的。然而,提前获取测试数据听起来是可行的,并且应该足以让你获得优势。
不幸的是,科学委员会已经采取了措施来防止可能的不公平。他们将测试数据拆分为 $N$ 个数据块,并将其分发给编号为 $1$ 到 $N$ 的 $N$ 个服务器。最初,服务器 $i$ 持有数据块 $i$。这 $N$ 个服务器通过 $N-1$ 条线路连接,使得任意两个服务器都可以直接或间接地相互连接。不时地,两个服务器会共享它们的数据,这意味着之后两者都存储相同的数据块,即它们之前各自存储的所有数据块的并集。任意两个直接相连的服务器,且仅有这些服务器,会精确地共享一次数据。
你已经获得了整个共享操作序列。为了协调你的黑客攻击,你希望在某些时间点(在两次共享操作之间)了解测试数据目前在服务器间的分布情况。更准确地说,你想要查询某个给定的服务器当前是否存储了某个给定的数据块,或者有多少个服务器当前存储了某个给定的数据块。
编写一个程序,根据给定的 (a) 共享操作序列和 (b) 每个查询发生的时间,来回答这些问题。
输入格式
输入描述了共享操作和查询的序列。第一行包含两个整数 $N$ 和 $K$。接下来的 $N + K - 1$ 行中,每一行可能具有以下形式之一:
S a b表示服务器 $a$ 和 $b$ 共享它们的所有数据。Q a d表示你查询服务器 $a$ 当前是否存储了数据块 $d$。C d表示你查询当前存储数据块 $d$ 的服务器数量(计数)。
其中 $N - 1$ 行以 S 开头,$K$ 行以 Q 或 C 开头。
输出格式
对于输入中的每个查询 Q a d,如果查询时服务器 $a$ 存储了数据块 $d$,你的程序应输出一行字符串 yes,否则输出 no。对于每个查询 C d,你的程序应输出一行包含单个整数:查询时存储数据块 $d$ 的服务器数量。当然,每个查询的答案仅取决于查询之前发生的共享操作。
数据范围
始终满足 $1 \le N, K \le 120\,000$。
- 子任务 1(5 分):$N \le 4\,000$
- 子任务 2(5 分):服务器 1 与服务器 $2, 3, \dots, N$ 直接相连。
- 子任务 3(10 分):服务器 $A$ 和 $B$ 直接相连,当且仅当 $|A - B| = 1$。
- 子任务 4(20 分):服务器 $A$ 和 $B$($A < B$)直接相连,当且仅当 $2A = B$ 或 $2A + 1 = B$。
- 子任务 5(25 分):任何服务器最多与 5 个其他服务器直接相连。
- 子任务 6(35 分):无附加限制。
此外,以下规则适用:在每个子任务中,如果你解决了所有从不查询“有多少服务器存储了某个数据块”(即没有输入行以 C 开头)的测试用例,你将获得该子任务 50% 的分数。在 CMS 系统中,这显示为相应子任务的“Group 1”。
注:在 QOJ 中,每个子任务的测试组被拆分为独立的子任务。也就是说,总共有 13 个子任务(子任务 #1 为样例),其中偶数编号的子任务对应那些没有输入行以 C 开头的测试。
样例
样例输入 1
6 9 S 1 2 S 1 3 S 3 4 Q 5 1 S 4 5 S 1 6 Q 5 1 Q 1 5 C 1 C 2 C 3 C 4 C 5 C 6
样例输出 1
no yes no 6 6 5 3 2 2
样例输入 2
4 4 S 1 2 S 1 3 S 3 4 Q 2 1 Q 2 2 Q 2 3 Q 2 4
样例输出 2
yes yes no no
- 确实如此,我们知道,你的团队领导也知道,但没关系。