Luogu P1196 [NOI2002]银河英雄传说:带权并查集
题目链接: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]银河英雄传说:带权并查集的更多相关文章
- Luogu P1196 [NOI2002]银河英雄传说
一年没写博客了(滑稽). 这道题很玄学,导致自己都有一个坑人的问题求解.如果有大佬有能力求帮助:https://www.luogu.org/discuss/show?postid=30231 再来讲一 ...
- 【洛谷】P1196 [NOI2002]银河英雄传说【带权并查集】
P1196 [NOI2002]银河英雄传说 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的 ...
- 解题报告:luogu P1196 [NOI2002]银河英雄传说
由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...
- P1196 [NOI2002]银河英雄传说 【带权并查集】
思路 用sum记录每个舰队的战舰数量, tohead 记录当前舰离舰首的距离,那么求任意两舰之间有多少舰显然就是 abs( tohead[i] - tohead[j] ) - 1: CODE #inc ...
- 洛谷——P1196 [NOI2002]银河英雄传说
P1196 [NOI2002]银河英雄传说 题目大意: 给你一个序列,支持两种操作: 合并指令为$M_{i,j}$j,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所 ...
- P1196 [NOI2002]银河英雄传说
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- [Luogu 1196] NOI2002 银河英雄传说
[Luogu 1196] NOI2002 银河英雄传说 话说十六年前的 NOI 真简单... 我一开始还把题看错了- 题意:一群人,每个人各自成一队,每次命令让两队首位相接合成一队,每次询问问你某两个 ...
- 洛谷P1196 [NOI2002] 银河英雄传说
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #includ ...
- 洛谷 P1196 [NOI2002]银河英雄传说
题意简述 有30000列,每列都有一艘战舰,编号1~30000 有2种操作: 1.将一列的战舰运到另一列 2.询问两个战舰是否在同一列,如果是,求出它们之间的距离 题解思路 并查集, 维护每个点x离自 ...
随机推荐
- Webpack与Gulp、Grunt区别
Webpack与Gulp.Grunt没有什么可比性,它可以看作模块打包机,通过分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等 ...
- NPOI 添加下拉列表
需求 给指定列添加下拉列表.如下图: 思路 NPOI的文档网站不能访问了,这里参考的POI文档. 加下拉列表有两种方式,一种直接写字符串,例如 new String[]{"10", ...
- 配置LANMP环境(8)-- 安装Samba与配置
Samba套件,将linux下的文件夹共享给windows(本地开发会很方便) 一.安装Samba yum install –y samba 二.配置Samba 1.备份配置文件 cp /etc/sa ...
- Power of Cryptography - poj 2109
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20351 Accepted: 10284 Description C ...
- erlang的非平衡的二叉树的操作
-module(tree1). -export([test1/0]). lookup(Key,nil) -> not_found; lookup(Key,{Key,Value,_,_}) -&g ...
- Android分享图片失败解决方案
前言:在做图片分享到微博或是用彩信分享的时候,会遇到“无法将图片添加到信息中”,其实这个问题的原因是创建的那个图片默认是,只能被当前应用调用,无法被其他应用调用,即分享的时候,无法读取到图片,并提示I ...
- solr6.5的分词
1.配置solr6.5自带中文分词.复制/usr/local/solr/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.5 ...
- z-index随笔
z-index这个css属性是用来控制层级的,但是它的表现有点奇怪,这里做下记录. 假如有ABC三层,都没设置z-index时,是按dom节点顺序来控制层级. 此时如果B元素下有个元素D,设置了z-i ...
- php输出缓冲区
ob_start(); echo 'aaa'; $string = ob_get_contents(); file_put_contents('a.html', $string); ob_flush( ...
- html5 (新一代的html)
简介 h5的新特性: cavas / video / audio / cache / element / form 最小的h5文档: <!DOCTYPE html> <html> ...