Cube Stack

Cube Stack

 

有一点lazy思想,设三个数组cnt代表它以下的有多少个元素(直到栈底),top[x]代表x所在栈的栈顶元素,dad[x]代表x所在栈的栈底元素,先寻找父亲,然后递归更新累加cnt,找父亲的时候更新cnt,对于一个元素,再用之前一定要找父亲,这样才会是真的cnt

#include<iostream>
#include<cstdio>
using namespace std;

int top[30010],cnt[30010],dad[30010];

int p; 

void Cin(int &x)
{
    char c=getchar();x=0;
    while(c<'0'||c>'9')c=getchar();
    while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
}

void Cout(int x)
{
    if(x>9) Cout(x/10);
    putchar(x%10+'0');
}

int getfather(int x)
{
    if(dad[x]==x)
    return x;
    int f=dad[x];
    dad[x]=getfather(dad[x]);
    cnt[x]+=cnt[f];
    return dad[x];
}

void merge(int x,int y)
{
    int F=getfather(x);
    int f=getfather(y);
    if(F!=f)
    {
    dad[F]=f;
    int t=getfather(top[f]);
    cnt[F]=cnt[top[f]]+1;
    top[f]=top[F];
    }
}

int main()
{
    for(int i=1;i<=30010;i++)
    {
        dad[i]=i;
        top[i]=i;
    }
    cin>>p;
    char c;
    int x,y;
    for(int i=1;i<=p;i++)
    {
        cin>>c;
        if(c=='M')
        {
            Cin(x),Cin(y);
          merge(x,y);    
        }
        else
        {
            cin>>x;
            int t=getfather(x);
            Cout(cnt[x]),putchar('
');
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/war1111/p/7349519.html