一年没写博客了(滑稽)。

  这道题很玄学,导致自己都有一个坑人的问题求解。如果有大佬有能力求帮助:https://www.luogu.org/discuss/show?postid=30231

  再来讲一下我对这道题的理解吧。

  首先,对于判断两个数是否在同一列战舰中,我们只需要朴素的并查集就可以。

  但这道题还要求我们去搞一个两船之间的距离(这就很难办了),所以只能使用带权并查集。

  我们开一个数组front[],来表示第i号战舰到i所在的战舰的队头的距离。这样如果两个战舰在同一列中,他们的距离就是abs(front[i]-front[j])-1(因为这两辆都不包括,因此-1)。

  这样是很方便,但当我们合并时,就会发生front[]值失去对应性。所以我们要不断地更新front[]。

  再开一个数组len[]表示以i为队头的队列的长度,这样在把i接到j后面时,只需要让front[fi]+=len[fj],并把len[fj]清零即可。

  最后对于front[]的更新,只需要在getfather时回溯完成即可。

  然后你就学会了如何打带权并查集(欧耶)!

  CODE

#include<cstdio>
using namespace std;
const int N=;
int father[N],front[N],len[N],i,t,x,y;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline void write(int x)
{
if (x<) putchar('-'),x=-x;
if (x/) write(x/);
putchar(x%+'');
}
inline int getfather(int k)
{
if (father[k]==k) return k;
int fa=getfather(father[k]);
front[k]+=front[father[k]];
return father[k]=fa;
}
inline int abs(int a) { return a<?-a:a; }
int main()
{
//freopen("testdata.in","r",stdin); freopen("my_out.out","w",stdout);
for (i=;i<N;++i)
father[i]=i,len[i]=;
read(t);
while (t--)
{
char ch=getchar();
while (ch!='M'&&ch!='C') ch=getchar();
read(x); read(y);
int fx=getfather(x),fy=getfather(y);
if (ch=='M')
{
front[fx]+=len[fy];
father[fx]=fy;
len[fy]+=len[fx];
len[fx]=;
} else write(fx==fy?abs(front[x]-front[y])-:-),putchar('\n');
}
return ;
}

Luogu P1196 [NOI2002]银河英雄传说的更多相关文章

  1. 解题报告:luogu P1196 [NOI2002]银河英雄传说

    由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...

  2. Luogu P1196 [NOI2002]银河英雄传说:带权并查集

    题目链接:https://www.luogu.org/problemnew/show/P1196 题意: 有30000个战舰队列,编号1...30000. 有30000艘战舰,编号1...30000, ...

  3. [Luogu 1196] NOI2002 银河英雄传说

    [Luogu 1196] NOI2002 银河英雄传说 话说十六年前的 NOI 真简单... 我一开始还把题看错了- 题意:一群人,每个人各自成一队,每次命令让两队首位相接合成一队,每次询问问你某两个 ...

  4. 洛谷——P1196 [NOI2002]银河英雄传说

    P1196 [NOI2002]银河英雄传说 题目大意: 给你一个序列,支持两种操作: 合并指令为$M_{i,j}$j​,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所 ...

  5. P1196 [NOI2002]银河英雄传说

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  6. 洛谷P1196 [NOI2002] 银河英雄传说

    #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #includ ...

  7. 洛谷 P1196 [NOI2002]银河英雄传说

    题意简述 有30000列,每列都有一艘战舰,编号1~30000 有2种操作: 1.将一列的战舰运到另一列 2.询问两个战舰是否在同一列,如果是,求出它们之间的距离 题解思路 并查集, 维护每个点x离自 ...

  8. 【洛谷P1196】[NOI2002]银河英雄传说

    银河英雄传说 题目链接 并查集时记录下以i为首的队列的长度(如果存在这个队列)num[i],便于合并, 和点i到队首的距离front[i],便于查询(在find时维护) #include<ios ...

  9. NOI2002 银河英雄传说

    P1196 银河英雄传说 367通过 1.1K提交 题目提供者该用户不存在 标签并查集NOI系列2001(或之前) 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 莱因哈特什么鬼? 私人代码 ...

随机推荐

  1. 通过 Cobalt Strike 利用 ms14-068

    拓扑图 攻击者(kali) 位于 192.168.245.0/24 网段,域环境位于 192.168.31.0/24 网段. 域中有一台 win7 有两张网卡,可以同时访问两个网段,以这台机器作为跳板 ...

  2. 快速配置webpack 4.x

    区分开发模式和生产模式: npm run start——开发模式,启用devServer,文件的改动实时更新.刷新 npm run build——生产模式,打包文件到dist文件夹 // packag ...

  3. apktool逆向apk包

    在AndroidStudio创建so一节里创建了so,并且在java里面调用so的HelloWorld方法,编译Android Studio后生成包app-debug.apk. 在逆向apk时如果该a ...

  4. Android--仿一号店货物详情轮播图动画效果

    还不是很完全,目前只能点中间图片才能位移,图片外的其他区域没有..(属性动画),对了,图片加载用得是facebook的一款android图片加载库,感觉非常NB啊,完爆一切. 1.先看布局 <? ...

  5. JSTL、JSTL核心标签库——流程处理标签

    JSTL环境 JSTL是另一个标准规范,并非在JSP的规范中,所以必须另外下载JSTL实现. 要使用JSTL标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri参考.例如,引入JST ...

  6. Oracle EBS AR 客户API

    ------------------------------------ 1. Set Environment ------------------------------------ -- 1a. ...

  7. wc 统计文件的行数,字数,字符

    格式:wc 参数 文件  默认统计文件的行数,字数,字符. -l   统计有多少行数 -c   统计有多少个字节 -m  统计有多少个字符 -w 统计有多少个字数

  8. GridBagLayout布局管理器应用详解

    http://www.cnblogs.com/kungfupanda/p/7220217.html GridBagLayout布局管理器应用详解 很多情况下,我们已经不需要通过编写代码来实现一个应用程 ...

  9. RecyclerView使用技巧(item动画及嵌套高度适配解决方案)

    原文地址 · Frank-Zhu  http://frank-zhu.github.io/android/2015/02/26/android-recyclerview-part-3/?utm_sou ...

  10. chrome历史记录,浏览记录,全选问题.

    一句话, 这个列表支持SHIFT多选 =,=!