1 条题解

  • 0
    @ 2023-3-13 11:51:14

    C++ :

    #include <iostream>
    #include <cstdio>
    #define N 502
    #define M 300002
    using namespace std;
    char op[10];
    int n,m,k,i,val[M],son[M][2],dis[M],fa[M],r[N];
    int merge(int x,int y)
    {
        if(!x) return y;
        if(!y) return x;
        if(val[x]>val[y]) swap(x,y);
        son[x][1]=merge(son[x][1],y);
        if(dis[son[x][0]]<dis[son[x][1]]) swap(son[x][0],son[x][1]);
        fa[son[x][0]]=fa[son[x][1]]=x;
        dis[x]=dis[son[x][1]]+1;
        return x;
    }
    void add(int x,int y,int z)
    {
        int f=fa[y],tmp=merge(son[y][0],son[y][1]);
        if(r[x]==y) r[x]=tmp;
        else if(son[f][0]==y) son[f][0]=tmp;
        else son[f][1]=tmp;
        fa[tmp]=f;
        fa[y]=son[y][0]=son[y][1]=0;
        val[y]+=z;
        r[x]=merge(r[x],y); 
    }
    int main()
    {
        scanf("%d %d %d",&n,&m,&k);
        for(i=1;i<=k;i++){
            int x,y,z;
            scanf("%s",op);
            if(op[0]=='A'){
                scanf("%d %d %d",&x,&y,&z);
                val[y]=z;
                r[x]=merge(r[x],y);
            }
            else if(op[0]=='D'){
                scanf("%d %d %d",&x,&y,&z);
                add(x,y,-z);
            }
            else if(op[0]=='T'){
                scanf("%d %d",&x,&y);
                r[y]=merge(r[x],r[y]);
                r[x]=0;
            }
            else if(op[0]=='M'){
                scanf("%d",&x);
                printf("%d\n",val[r[x]]);
            }
            else{
                scanf("%d %d",&x,&y);
                if((son[r[x]][0]&&val[r[x]]==val[son[r[x]][0]])||(son[r[x]][1]&&val[r[x]]==val[son[r[x]][1]])) puts("ERROR");
                else add(x,r[x],y);
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1815
    时间
    1000ms
    内存
    16MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者