
Replace the Numbers (并查集 | 倒叙模拟)
E. Replace the Numbers
[link](Problem - E - Codeforces)
题意
给你一个空的序列,有两种 *** 作
1
x
:
从
序
列
最
后
加
入
x
1 x:从序列最后加入x
1 x:从序列最后加入x,
2
x
y
:
将
当
前
序
列
里
所
有
的
x
变
成
y
2 x y: 将当前序列里所有的x变成y
2 x y:将当前序列里所有的x变成y。给你
q
q
q个 *** 作,输出 *** 作后的序列。
思路
并查集维护
如果每次从头到尾遍历修改复杂度太高。因为是对于一个相同数的 *** 作,也就是对于集合的 *** 作,我们可以用并查集来维护(选取集合代表元素),记录每个位置是什么数,每个数在哪个位置,即可。
对于一个新加的数,如果前面出现过就直接将其合并到前面,否则就初始化这个数在的位置。
对于要修改的
x
x
x变
y
y
y,如果
y
y
y出现过直接将
x
x
x的代表元素合并到
y
y
y上,将
x
x
x置为不存在,如果
y
y
y没出现过那就将
y
y
y置为
x
x
x的位置,将
x
x
x位置的数改为
y
y
y,置
x
x
x不存在即可。
Code
#include
#include
#include
#include
#include
#include
#include
#include
倒叙性质模拟
因为每个数可能会变多次,所以我们倒着来模拟,
f
[
y
]
:
y
变
成
什
么
f[y]:y变成什么
f[y]:y变成什么,对于插入 *** 作如果
f
[
x
]
!
=
0
f[x]!=0
f[x]!=0我们直接插入
f
[
x
]
f[x]
f[x]即可,对于改变 *** 作,如果
f
[
y
]
=
=
0
f[y]==0
f[y]==0代表后面
y
y
y不会改变,
f
[
x
]
=
y
f[x]=y
f[x]=y即可,如果
f
[
y
]
!
=
0
f[y]!=0
f[y]!=0代表后面
f
[
y
]
f[y]
f[y]变了
f
[
x
]
=
f
[
y
]
f[x]=f[y]
f[x]=f[y]即可(当前 *** 作被后面影响了),也有点路径压缩的感觉,最后正序输出即可。
Code
#include
#include
#include
#include
#include
#include
#include
#include
评论列表(0条)