BZOJ1483 - [HNOI2009]梦幻布丁

BZOJ1483 - Click Here

  

Description

  N个布丁摆成一行,进行M次操作。每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色。例如颜色分别为1,2,2,1的四个布丁一共有3段颜色。

  

Input

  第一行给出N,M表示布丁的个数和好友的操作次数。第二行N个数A1,A2…An表示第i个布丁的颜色从第三行起有M行,对于每个操作,若第一个数字是1表示要对颜色进行改变,其后的两个整数X,Y表示将所有颜色为X的变为Y,X可能等于Y。若第一个数字为2表示要进行询问当前有多少段颜色,这时你应该输出一个整数。(1<=n,m<=100,000;0<Ai,x,y<1,000,000)

  

Output

  针对第二类操作即询问,依次输出当前有多少段颜色。

  

Solutions

  由于给出的询问是要求从某种颜色变成另一种颜色。因此,若A颜色变成了B颜色,则之后的操作,A、B颜色必定是一起改变的。换言之,A、B集合合并后,必定不会分离。这样的话,就可以对每个颜色开个Treap,表示该颜色的集合。颜色的转换就等价于两棵Treap的合并。由于修改操作很多,需要利用启发式合并来减小合并的时间复杂度。

  颜色转化解决后,询问就变得十分简单了。插入时只需要判断是否存在可合并的点就可以了,这个用并查集可解决。答案就是,所有点-已合并的节点

  

CODE

CODE - Click Here

本站总访问量次 | 本站访客数人次

Powered by Hexo | Designed by iTimeTraveler | Refined by CSHwang