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

  这道题很玄学,导致自己都有一个坑人的问题求解。如果有大佬有能力求帮助: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. python新生类和经典类简单说明

    经典类: #!/usr/bin/env python #*-* coding:utf-8 *-* class A(): def __init__(self): print 'my name is GF ...

  2. BigDecimal 工具类

    arg1.compareTo(arg2) arg1 > arg2 返回 int 1 arg1 = arg2 返回 int 0 arg1 < arg2 返回 int -1 public cl ...

  3. MySQL索引背后的数据结构及算法原理(employees实例)

    摘要 http://blog.codinglabs.org/articles/theory-of-mysql-index.html 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特 ...

  4. 转-python异步IO-asyncio

    原文连接 http://blog.chinaunix.net/uid-190176-id-4223282.html 前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上 ...

  5. Use Jupyter notebook on Fedora 28

    生产环境使用 Fedora 28, 并且需要搭建一个 Jupyter 的notebook 方便使用,所搭建的Jupyter 支持单人远程 密码访问 1. 安装 安装 Jupyter , 出错 [roo ...

  6. 1.3Windows控制台的简单操作:

    目录: 1.控制台的打开 2.盘符的跳转 3.跳转到某个文件夹 4.展示文件 5.清屏 6.历史记录 7.拖动添加路径 8.自动补齐 9.正常退出 1.打开控制台:系统图标键 + R,输入cmd,按回 ...

  7. [HZNOI #koishi] Magic

    [HZNOI #514] Magic 题意 给定一个 \(n\) 个点 \(m\) 条边的有向图, 每个点有两个权值 \(a_i\) 和 \(b_i\), 可以以 \(b_i\) 的花费把第 \(i\ ...

  8. js字符串String常用方法

    1.   charAt()         返回指定位置的字符. str.charAt(index) index 为必须参数,类型为number(0到str.length-1之间,否则该方法返回 空串 ...

  9. 【js】实现继承的6种方法

    1.原型链 基本思想:利用原型链让一个引用类型继承另一个引用类型的属性和方法. 让原型对象(B.prototype)等于另一个类型的实例(new A()), 即B.prototype = new A( ...

  10. Vue.js实现前段评论展示

    本来想着给这个博客弄个回复系统(类似知乎的回复),最初的实现思路是这样的:主评论后台渲染,前台新增的评论,回复用jquery操作dom放到页面上.实现的时候感觉好复杂,大量的dom操作,目前前段框架不 ...