Typesetting math: 100%

[题解]AT_abc279_f [ABC279F] BOX

思路

对于操作 1,我们可以看做将 xx 号集合与 yy 号集合合并,并将原本的 yy 号集合重新开一个并查集维护。

对于操作 2,我们可以开一个数组维护每一个球所在哪一个并查集中。

对于操作 3,在操作 1 中维护每一个并查集对于了哪一个箱子即可。

因为 n+q6×105n+q6×105,所以数组开 6×1056×105 即可。

Code

#include <bits/stdc++.h>  
#define re register  
  
using namespace std;  
  
const int N = 6e5 + 10;  
int n,q,idx,num;  
int f[N],bd[N],nd[N],box[N];  
/*  
f 维护并查集  
bd 维护每一个箱子对应的并查集  
nd 维护每一个球对应的并查集  
box 维护每一个并查集对于的箱子   
*/   
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 1) + (r << 3) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
inline int find(int x){  
    if (f[x] != x) return f[x] = find(f[x]);  
    return f[x];  
}  
  
int main(){  
    n = idx = num = read();  
    q = read();  
    for (re int i = 1;i <= n;i++) f[i] = bd[i] = nd[i] = box[i] = i;  
    while (q--){  
        int op;  
        op = read();  
        if (op == 1){  
            int x,y;  
            x = read();  
            y = read();  
            f[bd[y]] = find(bd[x]);  
            bd[y] = ++idx;  
            f[idx] = idx;  
            box[idx] = y;  
        }  
        else if (op == 2){  
            int x;  
            x = read();  
            nd[++num] = bd[x];  
        }  
        else{  
            int x;  
            x = read();  
            printf("%d\n",box[find(nd[x])]);  
        }  
    }  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18262935

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示