[Luogu 1196] NOI2002 银河英雄传说
[Luogu 1196] NOI2002 银河英雄传说
话说十六年前的 NOI 真简单。。。
我一开始还把题看错了…
题意:一群人,每个人各自成一队,每次命令让两队首位相接合成一队,每次询问问你某两个人之间有几个人。
容易想到合并用并查集来实现。
至于计数,\(\mathrm{sum}_i\) 表示 \(i\) 到队首有几个人(如果 \(i\) 在队首,\(\mathrm{sum}_i = 0\));
\(\mathrm{num}_i\) 表示以 \(i\) 为队首的队伍有几个人(如果 \(i\) 不在队首, \(\mathrm{num}_i = 0\) )。
并查集 Find 的时候,递归回溯时更新 \(\mathrm{sum}_i\),不断加上其父亲的 \(\mathrm{sum}\)。
合并的时候,首先建立父子关系,然后更新 \(\mathrm{num}\) 和 \(\mathrm{sum}\),具体见代码中的 Merge 函数。
询问的话,如果两个人在同一队列中,两人的距离为他们到队首的距离差减一,即 \(|\mathrm{sum}_x - \mathrm{sum}_y| - 1\)。
完结撒花,还是挺好写的 qwq
#include <cstdio>
#include <cstdlib>
const int MAXN=30010;
int n;
class UFS
{
private:
int f[MAXN],sum[MAXN],num[MAXN];
int Find(int x)
{
if(x==f[x])
return x;
int t=Find(f[x]);
sum[x]+=sum[f[x]];
return f[x]=t;
}
public:
UFS(void)
{
for(int i=1;i<=30000;++i)
{
f[i]=i;
sum[i]=0;
num[i]=1;
}
}
void Union(int x,int y)
{
int a=Find(x),b=Find(y);
f[a]=b;
sum[a]+=num[b];
num[b]+=num[a];
num[a]=0;
}
void Query(int x,int y)
{
if(Find(x)^Find(y))
puts("-1");
else
printf("%d\n",abs(sum[x]-sum[y])-1);
}
}S;
int main(int argc,char** argv)
{
scanf("%d",&n);
for(int x,y;n--;)
{
char opt;
scanf("\n%c %d %d",&opt,&x,&y);
if(opt=='M')
S.Union(x,y);
else
S.Query(x,y);
}
return 0;
}
谢谢阅读。
[Luogu 1196] NOI2002 银河英雄传说的更多相关文章
- Luogu P1196 [NOI2002]银河英雄传说
一年没写博客了(滑稽). 这道题很玄学,导致自己都有一个坑人的问题求解.如果有大佬有能力求帮助:https://www.luogu.org/discuss/show?postid=30231 再来讲一 ...
- Luogu P1196 [NOI2002]银河英雄传说:带权并查集
题目链接:https://www.luogu.org/problemnew/show/P1196 题意: 有30000个战舰队列,编号1...30000. 有30000艘战舰,编号1...30000, ...
- 解题报告:luogu P1196 [NOI2002]银河英雄传说
由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...
- 数据结构(并查集):COGS 260. [NOI2002] 银河英雄传说
260. [NOI2002] 银河英雄传说 ★★☆ 输入文件:galaxy.in 输出文件:galaxy.out 简单对比时间限制:5 s 内存限制:128 MB [问题描述] 公元五 ...
- NOI2002 银河英雄传说
P1196 银河英雄传说 367通过 1.1K提交 题目提供者该用户不存在 标签并查集NOI系列2001(或之前) 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 莱因哈特什么鬼? 私人代码 ...
- P1196 [NOI2002]银河英雄传说
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- 洛谷——P1196 [NOI2002]银河英雄传说
P1196 [NOI2002]银河英雄传说 题目大意: 给你一个序列,支持两种操作: 合并指令为$M_{i,j}$j,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所 ...
- NOI2002银河英雄传说
原先就看过这道题,觉得很复杂. 不知道为什么今天一看觉得好水啊…… 难道这就是并查集的启发式合并? 数组d[i]表示i到其父节点的距离,即中间隔了多少船舰. 数组sum[i]记录以i为根的集合总共有多 ...
- 洛谷P1196 [NOI2002] 银河英雄传说
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #includ ...
随机推荐
- 软件工程课堂练习——找出1-n中1出现的个数
题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5. 在3 ...
- jQuery之数组处理函数
摘要:$.each,$.grep,$.map,$.merge,$.inArray,$.unique,$.makeArray 1. $.each(array, [callback]) 遍历[常用] 解释 ...
- ansible介绍和安装
ansible是由 Python 编写的强大的配置管理解决方案,ansible 的特点就在于它的简洁与高效率 ansible与其他的配置管理工具不同点在于:不需要你在想要配置的每个节点上安装自己的组件 ...
- vue-cli脚手架搭建
我们使用vue-cli来搭建整个项目,vue-cli就是一个脚手架,步骤很简单,输入几个命令之后就会生成整个项目,里面包括了webpack.ESLint.babel很多配置等等,省了很多事 Vue+ ...
- IDEA配置Java Web项目
IDEA部署maven tomcat的java web项目的关键配置:
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- bug:margin塌陷
margin塌陷:两个嵌套的div,内部div的margin-top失效,内部对于外部的div并没有产生一个margin值,而是外部的div相对于上面的div产生了一个margin值. 弥补方法: 1 ...
- canvas - 简单的神经网络
1.国际惯例,先上效果图 一下效果图使用三次贝塞尔曲线进行连线,代码中有直接使用直线连线的代码,可直使用. 2.查看演示请看 这里. 3 代码 html: <canvas id=&quo ...
- 【明哥报错簿】之【inside the host appBase has been specified, and will be ignored】和【did not find a matching property.】
tomcat启动时有时候会报一些警告,项目有时候也是可以正常运行.但是警告出现还是要找到原因消灭掉,两个典型的警告解决办法如下: 1.[inside the host appBase has been ...
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...