• 洛谷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. ruby 精选网站

      ruby 基础   http://www.yiibai.com/ruby/2013/0820174.html     http://www.rubydoc.info/github       http ...

    2. 序列化组件(get/put/delete接口设计),视图优化组件

      一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...

    3. BZOJ 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛:dp【前缀和优化】

      题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3398 题意: 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡 ...

    4. Mybatis-Generator_学习_01_mybatis-generator笔记

      一.generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

    5. spring2.5整合struts2

      首先第一步: 导入jar包: 我的做法: 导入你的基本使用的spring的jar包 和基本使用的struts2的jar包 然后struts2中有一个和spring整合的jar包一定要导入,不然会抛异常 ...

    6. 常见排序算法-php

      1.归并排序 $a = [1, 4, 6, 8, 10, 14, 16]; $b = [2, 3, 5, 8, 9, 11]; function merge_sort($a, $b) { $a_i = ...

    7. BZOJ1861:[ZJOI2006]书架

      浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

    8. 排名Top 16的Java实用类库

      (转载: http://www.hollischuang.com/archives/1606) github地址: https://github.com/liufeiSAP/javaStudy.git ...

    9. 面向对象——final关键字

      继承的弊端:打破了封装性 解决方式:final final关键字的特点: 1.final是一个修饰符,即可以修饰类,也可以修饰方法,还可以修饰变量 2.final修饰的类不可以被继承 3.final修 ...

    10. fabnacii数列

      Fibonacci数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义 ...