• 洛谷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. 转 Spring 组件 <context:component-scan base-pakage="">用法

      1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...

    2. python优缺点小结

      优点:  1.语言简洁优美 例如去除了大括号,写法简单,写法更接近于英语,其他语言几十上百行的代码,十来行就能解决,而且还好看 2.跨平台,window.linux.mac通用 3.排行高,社区完善 ...

    3. SQL语句编写注意问题

      下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍.在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描 ...

    4. 利用javascript动态向网页中添加表格

      效果图如下: 以下是代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

    5. 英特尔® Software Guard Extensions 教程系列:第一部分,英特尔® SGX 基础

      英特尔® Software Guard Extensions 教程系列:第一部分,英特尔® SGX 基础 from:https://software.intel.com/zh-cn/articles/ ...

    6. Python 微信通知 先挖个坑

      桑心病狂,试试把报警信息发到微信上 原文  https://segmentfault.com/a/1190000009717078  

    7. HihoCoder1672 : 区间问题([Offer收割]编程练习赛41)(贪心)

      时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定N个区间[Ai, Bi],请你找到包含元素最少的整数集合S,使得每个区间都至少有两个整数在S中. 例如给定三个区间[1 ...

    8. COGS 2581 无聊的会议V2

      传送 题目大意 给定一个长为\(n\)的序列,定义\(y\)在三元对\((x,y,z)\)中成为中心轴当且仅当同时满足:\(a_x = a_y = a_z,y-x=z-y,x<y<z\)对 ...

    9. HDU3991:Black and White

      浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:http://acm.hdu.edu.cn/showproblem.php? ...

    10. BZOJ2028:[SHOI2009]会场预约(线段树版)

      浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...