题目链接:https://www.luogu.org/problemnew/show/P1196

题意:

  有30000个战舰队列,编号1...30000。

  有30000艘战舰,编号1...30000,初始时第i艘战舰在第i个战舰队列中。

  然后t个操作:

    (1)M i j:将战舰i所在的队列整体接到战舰j所在队列的尾部。

    (2)C i j:询问战舰i,j之间有多少艘战舰。若i,j不在同一队列中,输出-1。

题解:

  dis[i]表示战舰i与par[i]之间的距离。

  siz[i]表示战舰i所在队列的大小。

  find(x):

    old为原本的par[x],now为路径压缩后的par[x]。

    此时关系为:x -> old -> now

    所以此时dis[x] = dis(x to old) + dis(old to now)

    即:dis[x] += dis[old]

  unite(x,y):

    px,py分别为x,y的真正祖先。

    因为是将px的整个队列接到了py队列的后面

    所以dis[px]=siz[py], siz[py]+=siz[px]

    (因为程序中只会用到队首的siz值,所以只更新py的siz就行了)

  query(x,y):

    如果不在同一集合中直接return -1.

    先让x,y找到它们的真正祖先。

    然后答案就是abs(dis[x]-dis[y]) - 1

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 30005 using namespace std; int t;
int par[MAX_N];
int dis[MAX_N];
int siz[MAX_N]; void init()
{
for(int i=;i<=;i++)
{
par[i]=i;
dis[i]=;
siz[i]=;
}
} int find(int x)
{
if(par[x]!=x)
{
int old=par[x];
int now=find(par[x]);
par[x]=now;
dis[x]+=dis[old];
}
return par[x];
} void unite(int x,int y)
{
int px=find(x);
int py=find(y);
if(px==py) return;
par[px]=py;
dis[px]=siz[py];
siz[py]+=siz[px];
} bool same(int x,int y)
{
return find(x)==find(y);
} inline int abs(int x)
{
return x> ? x : -x;
} int query(int i,int j)
{
if(!same(i,j)) return -;
find(i); find(j);
return abs(dis[i]-dis[j])-;
} int main()
{
init();
cin>>t;
char opt;
int i,j;
while(t--)
{
cin>>opt>>i>>j;
if(opt=='M') unite(i,j);
else cout<<query(i,j)<<endl;
}
}

Luogu P1196 [NOI2002]银河英雄传说:带权并查集的更多相关文章

  1. Luogu P1196 [NOI2002]银河英雄传说

    一年没写博客了(滑稽). 这道题很玄学,导致自己都有一个坑人的问题求解.如果有大佬有能力求帮助:https://www.luogu.org/discuss/show?postid=30231 再来讲一 ...

  2. 【洛谷】P1196 [NOI2002]银河英雄传说【带权并查集】

    P1196 [NOI2002]银河英雄传说 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的 ...

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

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

  4. P1196 [NOI2002]银河英雄传说 【带权并查集】

    思路 用sum记录每个舰队的战舰数量, tohead 记录当前舰离舰首的距离,那么求任意两舰之间有多少舰显然就是 abs( tohead[i] - tohead[j] ) - 1: CODE #inc ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Spring Boot 如何在类中应用配置文件

    如何在类中应用配置文件 优先级: 当前目录子目录的/config > 当前目录 > classpath的/config包 > classpath的根目录 即:越靠近的优先级越高 ** ...

  2. Power of Cryptography - poj 2109

      Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20351   Accepted: 10284 Description C ...

  3. 模拟多级复选框效果--jquery

    今天又次体会到jquery的强大了,做了个多级复选框的效果,代码总共就20+行就over了. 我又想用js来做一个看看,才写了几个方法就写不动了,兼容性要考虑很多,而且代码量直线上升. 主要分享下jq ...

  4. Photoshop经常使用快捷键(2)

    51.自由变换外框右键属性:ESC 取消 斜切:能够依照该调节边角点所引导出的两条边的角度进行移动.ctrl+shift 扭曲:随意点的调节.  ctrl 透视:模拟近大远小的关系.ctrl+shif ...

  5. 关于移动端border 1像素在不同分辨率下边显示粗细不一样的处理

    最近开发发现一个很有趣的问题  就是我如果给一个元素加上一个像素的 border 在不同的分辨率的情况下显示的不同 在高清屏幕(尤其是ios 喽 不鄙视国产) 据说在6plus下会变成3px  这个我 ...

  6. Coursera machine learning 第二周 编程作业 Linear Regression

    必做: [*] warmUpExercise.m - Simple example function in Octave/MATLAB[*] plotData.m - Function to disp ...

  7. 查看apache,nginx,mysql,linux,php版本

    查看apache版本 /usr/sbin/apachectl -v httpd -v 安装目录,使用apachectl -v mysql版本查看 mysql -V 查看linux版本 1.cat /e ...

  8. ios -仿微信有多级网页时,显示返回跟关闭按钮

    @property (nonatomic, copy) NSString * url; @interface WebViewController ()<UIWebViewDelegate,UIG ...

  9. 大海教你学手游2015CocosLua第一季_02场景跳转和用户触摸

    : 课程地址:http://ke.qq.com/cgi-bin/courseDetail?course_id=78017 cocos2d-x直播课交流群: 461039382(公布每节课视频和资料) ...

  10. maven3 org.codehaus.plexus.classworlds.launcher.launcher 找不到或无法加载主类

    maven3 org.codehaus.plexus.classworlds.launcher.launcher 找不到或无法加载主类 嗯,网上很多资料说是路径的问题,确实是有可能是路径的问题,而且还 ...