[ NOI 2002 ] 银河英雄传说
\(\\\)
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\) 所在的列头,有
\]
查询的时候,\(find\) 的过程中已经保证了两位置的 \(d\) 数组数值正确,所以在一列的两个战舰答案就是
\]
\(\\\)
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 ] 银河英雄传说的更多相关文章
- NOI2002_ Galaxy银河英雄传说86
NOI2002_ Galaxy银河英雄传说86 公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...
- P4847 银河英雄传说V2 题解(Splay)
题目链接 P4847 银河英雄传说V2 解题思路 我天哪!!!\(splay\)在\(rotate\)的时候先\(upd(y)\)再\(upd(x)\)!!以后不能再因为这个\(WA\)一晚上了!!! ...
- 【NOI 2002】 银河英雄传说
[题目链接] https://www.luogu.org/problemnew/show/P1196 [算法] 并查集 [代码] #include<bits/stdc++.h> using ...
- NOI 银河英雄传说
并查集水题,记录祖先,大小和深度即可,每次用祖先的大小和深度更新后代的深度. #include <cstdio> #include <iostream> #include &l ...
- NOI2002 银河英雄传说
P1196 银河英雄传说 367通过 1.1K提交 题目提供者该用户不存在 标签并查集NOI系列2001(或之前) 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 莱因哈特什么鬼? 私人代码 ...
- codevs1540 银河英雄传说
描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集 ...
- NOI2002 洛谷 P1196 银河英雄传说
神奇的并查集问题 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩 ...
- codevs 1540 银河英雄传说
题目描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米 ...
- 数据结构(并查集):COGS 260. [NOI2002] 银河英雄传说
260. [NOI2002] 银河英雄传说 ★★☆ 输入文件:galaxy.in 输出文件:galaxy.out 简单对比时间限制:5 s 内存限制:128 MB [问题描述] 公元五 ...
随机推荐
- gradle 安装及设置本地仓库地址
进入地址:http://services.gradle.org/ 下载-bin.zip 解压到自己指定的目录. 配置环境变量 GRADLE_HOME gradle的根目录. 在path 中 添加 % ...
- Node.js安装及环境配置之Windows篇(转:https://www.cnblogs.com/zhouyu2017/p/6485265.html)
Node.js安装及环境配置之Windows篇(原文地址:https://www.cnblogs.com/zhouyu2017/p/6485265.html) 一.安装环境 1.本机系统:Wind ...
- Centos系统备份
使用root用户切换到根目录 然后,使用下面的命令备份完整的系统: tar cvpzf backup.tgz / --exclude=/proc --exclude=/lost+found --exc ...
- ArcGIS 教程:Workflow Manager 高速浏览
应用程序概述 Workflow Manager 用户界面提供了用于在整个作业的生命周期中创建和管理作业的工具. 下面全部信息将会在本帮助文档的兴许章节中进行具体的说明. 文件菜单 新建 - 在系统中创 ...
- Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)
We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all kn ...
- bootstrap模态框出现或者消失的回调函数
当某一模态框出现的时候就触发函数: $(".modal").on('show.bs.modal',function(){ if(vueObj){...}else{//如果vue对象 ...
- jmeter获取时间_time 函数
原始时间戳13位精确到毫秒:${__time(,)} 时间戳精确到秒10位:${__time(/1000,)} 时间日期到年月日2019-04-21:${__time(yyyy-MM-dd,)} 时间 ...
- Unicode and .NET
http://csharpindepth.com/Articles/General/Unicode.aspx Scope of this page This is a big topic. Don't ...
- linux 查看php扩展
php -i |less 查看配置文件在哪里,编译参数 php -m |less 查看php加载的模块 less可以自由的上下访问,比more要灵活一点. 如果不使用less,信息一次性给予,不太好查 ...
- 今晚的两道 bc
第一道题 Beautiful Palindrome Number ,简单组合计数问题,手算打表就好~大概十五分钟左右搞定[第一次 提交竟然 wa了一次 有一个小小的坑在那.... /******** ...