计蒜客41384 so easy

https://nanti.jisuanke.com/t/41384

并查集

数据范围极大,用链表直接爆炸

我们考虑到询问次数无法达到\(10^9\),有许多数都是无用的

并查集同样能够模拟链表,一个节点链向他的祖先(在本题中,祖先为下一个索引)

我们用一个\(map\)来作为\(father\)数组,动态开点

\(C++ Code:\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int n,m,x,y;
map<int,int>f;
int getf(int x)
{
    return (f[x]==x)?x:(f[x]=getf(f[x]));
}
void New(int x)
{
    f[x]=x;
}
int main()
{
    scanf("%d%d",&n,&m);
    while (m --> 0)
    {
        scanf("%d%d",&x,&y);
        if (!f[y])
            New(y);
        switch (x)
        {
            case 1:
                f[y]=y+1;
                if (!f[y+1])
                    New(y+1);
                break;
            case 2:
                printf("%d\n",getf(y));
                break;
        }
    }
}
posted @ 2020-07-27 14:22  GK0328  阅读(80)  评论(0编辑  收藏  举报