luogu P 5092[USACO 2004 OPEN]Cube Stackingキューブゲーム

4819 ワード

タイトルの説明
ジョンとベシーはブロックゲームをしています.1...n 1ldots n 1...nと番号付けされたn n n(1≦n≦30000 1leq nleq 30000 1≦n≦30000)個のブロックが地面に置かれ、各立方柱が構成されている.
ゲーム開始後、ジョンはベシーにP P P(1≦P≦100000 1leq Pleq 100000 1≦P≦100000)個の命令を出す.命令は2種類あります.
  • 移動(M):Xを含む立方柱をYを含む立方柱に移動します.
  • 統計(C):Xを含む立方柱のXの下のブロック数を統計します.

  • プログラムを書いてベシーのゲームを完成させる.
    入力フォーマット
    1行目には、P P Pが入力され、その後、P P P行には、「MX Y」または「CX」という形式の命令が入力される.
    立方柱を自分の頭に置く命令がないことを保証します.
    出力フォーマット
    合計P P P P行を出力し、統計指令毎にその結果を出力する.
    入出力サンプル
    入力#1コピー
    6
    M 1 6
    C 1
    M 2 4
    M 2 6
    C 3
    C 4

    出力#1コピー
    1
    0
    2





    code:
    //
    #include
    using namespace std;
    int n,p;
    #define maxnn 40100
    int f[maxnn],dis[maxnn],cnt[maxnn];
    int  gf(int v,int num)
    {
        if(f[v]==v)
        {
            cnt[v]+=num;
            return v;
        }
        else
        {
            int fx=f[v];
            f[v]=gf(f[v],num);
            if(f[v]!=fx)
            dis[v]=dis[v]+dis[fx];
            return f[v];
        }
    }
    int main()
    {
        char a;
        cin>>p;
        int x,y;
        for(int i=1;i<=40000;i++)
        f[i]=i,dis[i]=0,cnt[i]=1;
        
        for(int i=1;i<=p;i++)
        {
            cin>>a;
            if(a=='M')
            {
                cin>>x>>y;
                int fy=gf(y,0);
                if(gf(y,0)!=gf(x,0))
                {
                dis[gf(y,0)]=cnt[gf(x,0)];
                f[gf(y,0)]=gf(x,0);
                cnt[gf(x,0)]+=cnt[fy];
                }
            }
            else
            {
                cin>>x;
                
                {
                gf(x,0);
                cout<0)])-1<<endl;
                }
            }
        }
    }