• 洛谷P1196 银河英雄传说

  • 题目描述

    公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …,30000。之后,他把自己的战舰也依次编号为1, 2, …, 30000,让第i号战舰处于第i列(i = 1, 2, …, 30000),形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为M i j,含义为让第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。 然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j。该指令意思是,询问电脑,杨威利的第i号战舰与第j号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。

    作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。

    最终的决战已经展开,银河的历史又翻过了一页……

    输入输出格式

    输入格式:

    输入文件galaxy.in的第一行有一个整数T(1<=T<=500,000),表示总共有T条指令。以下有T行,每行有一条指令。指令有两种格式:

    1. M i j :i和j是两个整数(1<=i , j<=30000),表示指令涉及的战舰编号。

    该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第i号战舰与第j号战舰不在同一列。

    1. C i j :i和j是两个整数(1<=i , j<=30000),表示指令涉及的战舰编号。

    该指令是莱因哈特发布的询问指令。

    输出格式:

    输出文件为galaxy.out。你的程序应当依次对输入的每一条指令进行分析和处理:

    如果是杨威利发布的舰队调动指令,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息;

    如果是莱因哈特发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第i 号战舰与第j 号战舰之间布置的战舰数目。

    如果第i 号战舰与第j号战舰当前不在同一列上,则输出-1。

    输入输出样例

    输入样例#1

    4

    M 2 3

    C 1 2

    M 2 4

    C 4 2

    输出样例#1

    -1

    1

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MAXN 30010
    int T,father[MAXN],sum[MAXN],cnt[MAXN];
    char s[];
    int find(int x)
    {
    if(x==father[x])return father[x];
    int fa=father[x];
    father[x]=find(father[x]);
    cnt[x]+=cnt[fa];
    return father[x];
    }
    int abs(int x)
    {
    return x<?-x:x;
    }
    void merge(int a,int b)
    {
    father[a]=b;
    cnt[a]=sum[b];
    sum[b]+=sum[a];
    sum[a]=;
    }
    int main()
    {
    scanf("%d",&T);
    for(int i=;i<=MAXN;i++)father[i]=i,sum[i]=;
    while(T--)
    {int x,y;
    cin>>s;
    scanf("%d%d",&x,&y);
    int f1=find(x),f2=find(y);
    if(s[]=='M') merge(f1,f2);
    else
    {
    if(f1!=f2) printf("-1\n");
    else printf("%d\n",abs(cnt[x]-cnt[y])-);
    }
    }
    }

    poj1998  Cube Stacking

    有几个stack,初始里面有一个cube。
    支持两种操作:
    1.move x y: 将x所在的stack移动到y所在stack的顶部。
    2.count x:数在x所在stack中,在x之下的cube的个数。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MAXN 30010
    int p,sum[MAXN],cnt[MAXN],x,y,father[MAXN];
    char s[];
    int find(int c)
    {
    if(c==father[c])return father[c];
    int fa=father[c];
    father[c]=find(father[c]);
    cnt[c]+=cnt[fa];
    return father[c];
    }
    void merge(int x,int y)
    {
    father[y]=x;
    cnt[y]=sum[x];
    sum[x]+=sum[y];
    sum[y]=;
    }
    int main()
    {
    scanf("%d",&p);
    for(int i=;i<=MAXN;i++)father[i]=i,sum[i]=;
    while(p--)
    {
    scanf("%s",s);
    if(s[]=='M')
    { scanf("%d%d",&x,&y);
    int f1=find(x),f2=find(y);
    merge(f1,f2);//f1移到f2顶部
    }
    else
    {
    scanf("%d",&x);
    printf("%d\n",sum[find(x)]-cnt[x]-);
    }
    }
    }

    加权并查集(银河英雄传说,Cube Stacking)的更多相关文章

    1. NOI2002_ Galaxy银河英雄传说86

      NOI2002_ Galaxy银河英雄传说86     公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...

    2. codevs 1540 1540 银河英雄传说

      1540 银河英雄传说 题目描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银 ...

    3. P1196 银河英雄传说(加权并查集)

      P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在 ...

    4. 【洛谷P1196】银河英雄传说

      有特殊意义的一道题-- 加权并查集,我们增加cnt.deep数组 分别表示i点所在链共有多少个点,以及路径压缩之前点i在链中的深度 每次合并时直接修改cnt,路径压缩的同时更新deep 因为每次查询之 ...

    5. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

      题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...

    6. hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)

      这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...

    7. HDU 3407.Zjnu Stadium 加权并查集

      Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

    8. A Bug's Life(加权并查集)

      Description Background  Professor Hopper is researching the sexual behavior of a rare species of bug ...

    9. A Bug's Life(加权并查集)

      Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs ...

    10. Zjnu Stadium(加权并查集)

      Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

    随机推荐

    1. 【ES6】更易于继承的类语法

      和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...

    2. stm32f429I discovery试用

      从网上了解到stm32f429I discovery可以跑单片机程序也可以跑uclinux,而我恰好喜爱嵌入式开发相关内容, 性价比也较高,所以新入手了这款开发板.开发板官方网页:http://www ...

    3. 吴恩达机器学习笔记(二) —— Logistic回归

      主要内容: 一.回归与分类 二.Logistic模型即sigmoid function 三.decision boundary 决策边界 四.cost function 代价函数 五.梯度下降 六.自 ...

    4. matlab添加当前文件夹到函数搜索目录

      pwd表示当前路径p = genpath(folderName) 返回一个包含路径名称的字符向量,该路径名称中包含 folderName 以及 folderName 下的多级子文件夹. addpath ...

    5. less的安装使用和入门实践

      1.简介 LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LESSCSS可 ...

    6. 分享知识-快乐自己:2017IDEA破解教程

      首先 修改host文件: 文件路径:C:\Windows\System32\drivers\etc\hosts 修改:将“0.0.0.0 account.jetbrains.com”追加到hosts文 ...

    7. Mybatis-Generator_学习_02_使用Mapper专用的MyBatis Generator插件

      源码见:https://github.com/shirayner/tk-mybatis-generator 一.要点 二.具体实现 1.项目结构 2.配置 pm.xml <?xml versio ...

    8. 监听输入框变化(oninput,onpropertychange,onchange)

      oninput,onpropertychange,onchange: oninput是onpropertychange的非IE浏览器版本,支持firefox和opera等浏览器,但有一点不同,它绑定于 ...

    9. codeforces 659E E. New Reform(图论)

      题目链接: E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard ...

    10. 每天一个linux命令(4):pwd命令

      版权声明更新:2017-05-08博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下命令cd. 2 开发 ...