Mayflyyh
Mayflyyh
MayFlyyh's Blog
题解 Luogu P1196 银河英雄传说

Luogu P1196 银河英雄传说

公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。
宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。

杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …,30000。之后,他把自己的战舰也依次编号为1, 2, …, 30000,让第i号战舰处于第i列(i = 1, 2, …, 30000),形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为M i j,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。

然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。

在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j。该指令意思是,询问电脑,杨威利的第i号战舰与第j号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。

作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。最终的决战已经展开,银河的历史又翻过了一页……

我们记录一列有多少个战舰,再记录每个战舰上面共有多少战舰

每次合并两列X,Y 即将X的祖先设为Y,Y列战舰数+=X列战舰数

h(x首)=Y列战舰数(显然将X整体放在Y下面,那么X的最上面的上面即有原来Y的战舰数量

合并操作是有最有趣的

思考这样一个问题,由于有了路径压缩的存在,所以每次再查询后,任何一个节点的父亲都是该树的根

具体看图中说明

http://t1.aixinxi.net/o_1c9rts466mjl1b8r1g6g9gq1jtga.png-j.jpg

Code:

#include<bits/stdc++.h>
int f[40000],sum[40000];
int h[40000];
int T,x,y;
char c[10];
inline int find(int x){
    if(!f[x]) return x;
    int fa=find(f[x]);
    h[x]+=h[f[x]];
    f[x]=fa;
    return fa;
}
inline int merge(int x,int y){
    if(x==y) return 0;
    int t1=find(x),t2=find(y);
    f[t1]=t2;
    h[t1]=sum[t2];
    sum[t2]+=sum[t1];

}
int ans(int x,int y){
    if(x==y) return 0;
    int t1=find(x),t2=find(y);
    if(t2!=t1) return -1;
    return abs(h[x]-h[y])-1;
}
int main(){
    scanf("%d",&T);
    for(int i=1;i<=30000;++i) 
        sum[i]++; 
    while(T--){
        scanf(" %s %d %d",c,&x,&y);
        if(c[0]=='M'){
            merge(x,y);
        }
        if(c[0]=='C'){
            printf("%d\n",ans(x,y));
        }
    }
}
本文链接:http://www.mayflyyh.com/archives/188
知识共享许可协议
本文采用CC BY-NC-SA 3.0进行许可。
首页      并查集      题解 Luogu P1196 银河英雄传说
http://0.gravatar.com/avatar/6cc3a2831375e487976e09c80dfcb52e?s=256&d=monsterid&r=g

MayFlyyh

文章作者

Oier

发表评论

textsms
account_circle
email

MayFlyyh's Blog

题解 Luogu P1196 银河英雄传说
Luogu P1196 银河英雄传说 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。 宇宙历七九九年,银河系的…
扫描二维码继续阅读
2018-03-31