信竞就是修电脑

题目

题目描述
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(1d200,1n5000,1m106) ,依次表示信息交换协议的个数,程序的个数,修电脑用的总时间。

接下来 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(1a<bn,1kd) ,第 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 1a,bn ,且 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值