\(\\\)

Description


有 \(n\) 列战场,每一列一开始只有一个战舰,编号就是对应的战场编号。

有 \(m\) 次操作:

  • \(M_{i,j}\) :把 \(i\) 所在的一整列接在 \(j\) 所在的一列的最后面。
  • \(C_{i,j}​\) :查询 \(i,j​\) 是否在同一列里,若在的话输出两者之间隔了多少个战舰。

注意每一列战场的战舰都是排成一列的。

\(\\\)

Solution


带偏移量的并查集。

记录 \(d[x]\) 表示 \(x\) 到所在列头的一段上共有多少个战舰。

记录 \(sz[x]\) 表示 \(x\) 所在的一列有多少个战舰。

为了保证复杂度,我们在做的时候还是要路径压缩。


但是 \(d[x]\) 怎么保证正确?递归的时候这么写就好了。

int find(int x){
if(x==f[x]) return x;
int fa=find(f[x]);
d[x]+=d[f[x]];
return f[x]=fa;
}

注意是 \(d[x]+=d[f[x]]\),因为之前可能路径压缩过。还有注意 $f[x] $ 的更新时间。


合并的时候,记 \(f_i\) 表示 \(i\) 所在一列的列头,\(f_j\) 表示 \(j\) 所在的列头,有

\[d[f_i]=sz[f_j]
\]

查询的时候,\(find\) 的过程中已经保证了两位置的 \(d\) 数组数值正确,所以在一列的两个战舰答案就是

\[|d[x]-d[y]|-1
\]

\(\\\)

Code


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 30010
#define R register
#define gc getchar
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} struct UFS{
int f[N],d[N],sz[N];
UFS(){for(R int i=1;i<N;++i){f[i]=i;sz[i]=1;}}
int find(int x){
if(x==f[x]) return x;
int fa=find(f[x]);
d[x]+=d[f[x]];
return f[x]=fa;
}
inline void merge(int x,int y){
int fx=find(x),fy=find(y);
d[fx]=sz[fy]; f[fx]=fy; sz[fy]+=sz[fx];
}
}ufs; int main(){
char op;
int t=rd(),x,y;
while(t--){
op=gc(); while(!isalpha(op)) op=gc();
if(op=='M'){x=rd();y=rd();ufs.merge(x,y);}
else{
x=rd(); y=rd();
if(ufs.find(x)!=ufs.find(y)) puts("-1");
else printf("%d\n",abs(ufs.d[x]-ufs.d[y])-1);
}
}
return 0;
}

[ NOI 2002 ] 银河英雄传说的更多相关文章

  1. NOI2002_ Galaxy银河英雄传说86

    NOI2002_ Galaxy银河英雄传说86     公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...

  2. P4847 银河英雄传说V2 题解(Splay)

    题目链接 P4847 银河英雄传说V2 解题思路 我天哪!!!\(splay\)在\(rotate\)的时候先\(upd(y)\)再\(upd(x)\)!!以后不能再因为这个\(WA\)一晚上了!!! ...

  3. 【NOI 2002】 银河英雄传说

    [题目链接] https://www.luogu.org/problemnew/show/P1196 [算法] 并查集 [代码] #include<bits/stdc++.h> using ...

  4. NOI 银河英雄传说

    并查集水题,记录祖先,大小和深度即可,每次用祖先的大小和深度更新后代的深度. #include <cstdio> #include <iostream> #include &l ...

  5. NOI2002 银河英雄传说

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

  6. codevs1540 银河英雄传说

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

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

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

  8. codevs 1540 银河英雄传说

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

  9. 数据结构(并查集):COGS 260. [NOI2002] 银河英雄传说

    260. [NOI2002] 银河英雄传说 ★★☆   输入文件:galaxy.in   输出文件:galaxy.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 公元五 ...

随机推荐

  1. 解析excel文件并将数据导入到数据库中

    今天领导给安排了一个临时工作,让我将一个excel里面的数据解析后放入数据库中,经过一个下午的努力成功完成,现在将代码献上,希望对大家有所帮助 一.需要导入的jar 1.commons-collect ...

  2. Linux系统备份还原工具1(DD)(应用实例)

    DD使用教程:http://www.cnblogs.com/EasonJim/p/7442223.html 以下实例没经过大量测试,可能在一些机器上不会有效. 一般围绕以下几点进行设置: 1.dd完后 ...

  3. AIM Tech R3 div2 E Centroid

    思路很明显了,假设是点x,则看它的子树中是否有大于n/2的,如果有,则在该子树中剪去它可以剪的且小于n/2的,接到点x上. 则统计出在以x点为根的子树中,它的各子树可以剪去的且小于n/2的最大子子树. ...

  4. PLSQL Developer来实现不同数据库的表结构以及表数据同步

    PLSQL Developer菜单条中 Tools选项下有Compare User Objects和Compare Table Data功能. 一.Tools --> compare user ...

  5. Moravec算子

    Moravec在1981年提出了Moravec角点检測算子,并将它应用于立体匹配.它是一种基于灰度方差的角点检測方法.该算子计算图像中某个像素点沿着水平.垂直.对角线.反对角线四个方向的灰度方差,当中 ...

  6. 移动硬盘/U盘上装Windows 7旗舰版(VHD版)

    真正的移动版WIN7,在移动硬盘/U盘上运行的WIN7 工具准备 - 联想Y450本本,已安装Windows 7旗舰版(或者WINPE3.0版),用来给移动WIN7做引导 -Win7.vhd,15G, ...

  7. Unity3D 玻璃 Shader

     Shader "Custom/Glass" { // Upgrade NOTE: replaced 'SeperateSpecular' with 'SeparateSpec ...

  8. 12.解决CCScale9Sprite或者CCControlButton无法使用的问题。

    问题: 使用CCScale9Sprite或者CCControlButton等控件的时候,会出现无法识别的情况. 解决方式: 1.include对应的头部,即#include "cocos-e ...

  9. 黑马day16 aptana插件的安装

    aptana: eclipse或者myeclipse中的javaScript,html,css的代码提示功能非常差...因此我们选择了这个框架. aptana的安装步骤: 1.须要下载aptana的插 ...

  10. 硬件十万个为什么——运放篇(五)PCB设计技巧

    1.在PCB设计时,芯片电源处旁路滤波等电容应尽可能的接近器件.典型距离是小于3MM 2.运算放大器芯片电源处的小陶瓷旁路电容在放大器处于输入高频信号时能够为放大器的高频特性提供能量电容值的选择依据输 ...