算法分析
模拟+思维
倒着更新,如果前后数有关联的话,前面的数一定会被2操作给修改,因此倒着维护数的关系,然后用到了,并查集中f[]的思想,维护当前被修改后最终的结果
AC code
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int f[N];
struct node
{
int op,x,y;
};
vector<node>v;
vector<int>ans;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int q;
cin >> q;
while(q --)
{
int op;
cin >> op;
if(op == 1)
{
int x;cin >> x;
v.push_back({op,x,0});
}
else
{
int x,y;cin >> x >> y;
v.push_back({op,x,y});
}
}
for(int i = 1;i <= 5e5;i ++) f[i] = i;
reverse(v.begin(),v.end());
for(auto [op,x,y] : v)
{
if(op == 1) ans.push_back(f[x]);
else f[x] = f[y];
}
reverse(ans.begin(),ans.end());
for(auto x : ans) cout << x << " ";
return 0;
}