题目
题目描述
P
P
L
PPL
PPL 的女盆友的电脑坏了!于是她找到了学编程的
P
P
L
PPL
PPL ,让他修好这个电脑。
具体来说,每个程序有 d d d 种不同的信息交换协议(以下简称协议),现在有 n n n 个程序(编号 1 1 1 到 n n n )要交换信息。
如果要成功的交换信息,就要 d d d 个协议均互相信任。互相信任就是互相确认。
互相确认可以是间接的,譬如 a a a 信任 b b b , b b b 信任 c c c ,则 a a a 与 c c c 也互相信任。当然,只有同种信息交换协议可以互相信任。
电脑现在所有的信息交换协议都不互相信任。就是说, P P L PPL PPL 用记事本编程,调用 cmd \text{cmd} cmd 编译都不行。
P
P
L
PPL
PPL 很强,所以修的很快,每秒都可以让两个信息交换协议互相信任,可是他的女盆友觉得太快了不好(我才没有开车),所以要求他每修好一个,就要告诉她有多少对程序可以互相交换信息。
P P L PPL PPL想专心修电脑,所以他把问题交给了你。
输入格式
第一行包含三个正整数
d
,
n
,
m
(
1
≤
d
≤
200
,
1
≤
n
≤
5000
,
1
≤
m
≤
1
0
6
)
d,n,m(1\le d\le 200,1\le n\le 5000,1\le m\le 10^6)
d,n,m(1≤d≤200,1≤n≤5000,1≤m≤106) ,依次表示信息交换协议的个数,程序的个数,修电脑用的总时间。
接下来 m m m 行,每行包含三个正整数 a , b , k ( 1 ≤ a < b ≤ n , 1 ≤ k ≤ d ) a,b,k(1\le a< b\le n,1\le k\le d) a,b,k(1≤a<b≤n,1≤k≤d) ,第 x + 1 x+1 x+1 行表示第 x x x 秒时 P L L PLL PLL 让 a a a 号程序和 b b b 号程序的第 k k k 种信息交换协议互相信任。
输出格式
输出
m
m
m 行,每行一个正整数,依次表示每次操作之后满足编号为
a
,
b
a,b
a,b 的程序可以互相交换信息的有序数对
(
a
,
b
)
(a,b)
(a,b) 的个数(
a
a
a 可以等于
b
b
b ;一个协议永远信任自己)。
思路
不知道题目描述清楚没有 😂 原题是这样的:
给定 d d d 张无向图,每张图都有 n n n 个点。一开始,在任何一张图中都没有任何边。
接下来有 m m m 次操作,每次操作会给出 a , b , k a,b,k a,b,k ,意为在第 k k k 张图中的点 a a a 和点 b b b 之间添加一条无向边。
你需要在每次操作之后输出有序数对 ( a , b ) (a,b) (a,b) 的个数,使得 1 ≤ a , b ≤ n 1\le a,b\le n 1≤a,b≤n ,且 a a a 点和 b b b 点在 d d d 张图中都连通。( a , b a,b a,b 可以相等)
蒟蒻作者为了膜身边的 P P L PPL PPL ,把题改了一下。 P P L PPL PPL orz or2 orz 。
好吧现在我们分析一下这个题目。连通性问题一下子就想到并查集嘛!
然后有 d d d 张图。那么 d d d 个并查集的根都相同 就是满足条件的 ( a , b ) (a,b) (a,b) 之一。直接将这些根串成 string \text{string} string ,用 Hash \text{Hash} Hash代替字符串比较相等。
仍使用并查集,启发式合并,暴力修改 H a s h Hash Hash 值。用 m a p map map 或者 s e t set set 统计相同的。
代码
Defeat