1 条题解

  • 0
    @ 2025-5-4 14:49:39

    数据结构设计:并查集(Union-Find):用于管理节点的分组关系,支持快速合并和查找。距离数组 dis[]:记录每个节点到其父节点的距离。核心操作:查找(find):带路径压缩的查找,同时更新节点到根节点的距离。合并(solve):将两个节点所在的集合合并,并设置节点间的距离关系。距离更新策略:查找时,通过路径压缩将节点直接指向根节点,并累加路径上的距离。合并时,设置节点 x 的父节点为 y,并记录 x 到 y 的距离为 (|x-y| % 1000)。

    
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    #define ls 2*i
    #define rs 2*i+1
    #define up(i,x,y) for(i=x;i<=y;i++)
    #define down(i,x,y) for(i=x;i>=y;i--)
    #define mem(a,x) memset(a,x,sizeof(a))
    #define w(a) while(a)
    #define LL long long
    const double pi = acos(-1.0);
    #define Len 20005
    #define mod 19999997
    const int INF = 0x3f3f3f3f;
     
    int t,n;
    char str[5];
    int father[Len],dis[Len];
     
    int find(int x)
    {
        if(x == father[x])
            return x;
        int fx = find(father[x]);
        dis[x] = dis[x]+dis[father[x]];
        return father[x]=fx;
     
    }
     
    void solve(int x,int y)
    {
        int fx = find(x),fy = find(y);
        if(fx == fy)
        return;
        father[x] = x;
        dis[fx] = dis[x];
        father[x] = y;
        dis[x] = abs(x-y)%1000;
    }
     
    int main()
    {
        int i,j,k,x,y;
        scanf("%d",&t);
        w(t--)
        {
            scanf("%d",&n);
            up(i,0,n)
            {
                father[i] = i;
                dis[i] = 0;
            }
            w(~scanf("%s",str))
            {
                if(str[0]=='O')
                    break;
                if(str[0]=='E')
                {
                    scanf("%d",&x);
                    find(x);
                    printf("%d\n",dis[x]);
                }
                else
                {
                    scanf("%d%d",&x,&y);
                    solve(x,y);
                }
            }
        }
     
        return 0;
    }                      
    
    
    • 1

    信息

    ID
    963
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者