• 洛谷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. yhdsir@function:php

      curl 获取页面信息 function curl_get_content($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $u ...

    2. 7-4 汉密尔顿回路(25 分) 【STL】

      7-4 汉密尔顿回路(25 分) 著名的"汉密尔顿(Hamilton)回路问题"是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次).本题就要求你判断任一给定的回路是 ...

    3. Android LinearLayout线性布局

      LinearLayout是线性布局控件:要么横向排布,要么竖向排布 决定性属性:必须有的! android:orientation:vertical (垂直方向) .horizontal(水平方向) ...

    4. 窥探 Swift 之别具一格的 Struct 和 Class

      说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...

    5. 理解Java泛型 通配符 ? 以及其使用

      什么是泛型: 泛型从字面上理解,是指一个类.接口或方法支持多种类型,使之广泛化.一般化和更加通用.Java中使用Object类来定义类型也 能实现泛型,但缺点是造成原类型信息的丢失,在使用中容易造成C ...

    6. quick check

    7. PYTHON 爬虫笔记五:BeautifulSoup库基础用法

      知识点一:BeautifulSoup库详解及其基本使用方法 什么是BeautifulSoup 灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便实现网页信息的提取库. ...

    8. 连接并同步windows下的git仓库

      1. 需求 电脑A和电脑B本来通过服务器同步工作目录.服务器时linux系统上有个裸仓库,不管在A上还是B上工作,工作完毕后使用git go与服务器仓库同步.A和B都是windows系统,在工作目录下 ...

    9. xgboost算法原理

      XGBoost是2014年3月陈天奇博士提出的,是基于CART树的一种boosting算法,XGBoost使用CART树有两点原因:对于分类问题,CART树的叶子结点对应的值是一个实际的分数,而非一个 ...

    10. linux 进程学习笔记-进程ID,PID

      PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...