CF1620E Replace the Numbers
简单题。对于这种序列修改查询问题,一般有一个静态做法就是倒着做,本题只需记录 \(f_x\) 表示处理了倒着的 \(i\) 个操作后,初值为 \(x\) 最终会变成谁。遇到一个操作 2 就执行 \(f_x = f_y\)。中途还想复杂了,这根本不需要建图或者并查集。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
using namespace std;
using ll = long long;
const int N = 6e5;
int ans[N], cnt = 0;
int f[N], x[N], y[N], op[N];
void Main(){
int q, mx = 0;
cin >> q;
F(i, 1, q){
cin >> op[i];
if(op[i] == 1){
cin >> x[i];
++ cnt;
}
else{
cin >> x[i] >> y[i];
mx = max(mx, y[i]);
}
}
int o = cnt;
F(i, 1, 500000){
f[i] = i;
}
G(i, q, 1){
if(op[i] == 1){
ans[o] = f[x[i]];
-- o;
}
else{
f[x[i]] = f[y[i]];
}
}
F(i, 1, cnt){
cout << ans[i] << ' ';
}
return ;
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T = 1;
while(T --) Main();
return fflush(0), 0;
}

浙公网安备 33010602011771号