zoukankan      html  css  js  c++  java
  • [Usaco2004 Open]Cube Stacking 方块游戏

    题面:

        约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.
       游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令.指令有两种:
        1.移动(M):将包含X的立方柱移动到包含Y的立方柱上.
        2.统计(C):统计名含X的立方柱中,在X下方的方块数目.
        写个程序帮贝茜完成游戏.
     
    解法:带权并查集,记录一个底面,顶面,x上面的立方体的个数。
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N=300005;
    int n,dep[N],dis[N],fa[N];
    int find(int x) {
        if(x!=fa[x]) {
            int fx=fa[x];
            fa[x]=find(fx);
            dep[x]=dep[fx];
            dis[x]+=dis[fx];
        }
        return fa[x];
    }
    inline void merge(int x,int y) {
        int fx=find(x),fy=find(y);
        fa[fy]=fx;dis[fy]=dis[dep[x]]+1;dep[fx]=dep[fy];
        find(dep[fx]),find(dep[fy]);
    }
    int main() {
        scanf("%d",&n);
        for(int i=1;i<N;i++) fa[i]=dep[i]=i;
        char opt[3];int x,y;
        for(int i=1;i<=n;i++) {
            scanf("%s",opt);
            switch (opt[0]) {
                case 'M' :scanf("%d%d",&x,&y);merge(x,y);break;
                case 'C' :scanf("%d",&x);find(x);printf("%d
    ",dis[dep[x]]-dis[x]);break;
            }
        }    
    }
    [Usaco2004 Open]Cube Stacking 方块游戏
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    iOS 字典实现原理
    IOS中armv7,armv7s,arm64以及i386和x86_64讲解
    SDWebImage源码解析
    iOS Runtime的消息转发机制
    二叉树的遍历
    LINUX 常用命令 ps 详解
    LINUX 文件权限详解
    LINUX查看内存使用情况 free
    PHP isset() empty() isnull() 的区别
    PHP unset()函数销毁变量 但没有实现释放内存
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9740444.html
Copyright © 2011-2022 走看看