[NOI2002]银河英雄传说,洛谷之提高历练地,并查集

原创 2018年04月15日 16:38:12

正题

      第四题:[NOI2002]银河英雄传说

      这道题看上去很简单,做起来却对ij之间飞船的数量给搞混了。那么我们很容易就可以知道,要求ij之间的飞船个数,只要我们知道j前面有多少飞船,i前面有多少飞船即可,直接用abs(d[i]-d[j])-1即可。

      恶心就恶心在维护d值上。

      首先我们要讨论初始化,用d来记录i前面有多少个飞船,初始值设为0,that[i]来存储以i开头的队列的长度,如果i不是队头,那么就为0.很明显初始值要设为1.

      在转移的过程中,加到后面的队列的d当然要加上前面队列的长度(给队头的加上即可,后面的会根据当前祖先来更新)。后面的that当然要变为0.

      讲讲怎么维护这个d和fa。d在fa的d更新完毕后要更新自己的,fa要等到d更新完再更新。否则就会出错,看图


代码<虽然有代码帮助理解但是自己实现会更好>

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cstring>
using namespace std;

int T;
const int n=30000;
int d[30010];
int f[30010];
int that[30010];

int findpa(int x){
	if(f[x]!=x){
		int now=findpa(f[x]);
		d[x]+=d[f[x]];
		f[x]=now;
	}
	return f[x];
}

int main(){
	scanf("%d",&T);	
	for(int i=1;i<=n;i++)
		d[i]=0,f[i]=i,that[i]=1;
	char c[2];
	int x,y;
	for(int i=1;i<=T;i++){
		scanf("%s",c);
		scanf("%d %d",&x,&y);
		int fx=findpa(x),fy=findpa(y);
		if(c[0]=='M'){
			d[fx]+=that[fy];
			f[fx]=fy;
			that[fy]+=that[fx];
			that[fx]=0;
		}
		else{
			if(fx!=fy) printf("-1\n");
			else{
				printf("%d\n",abs(d[x]-d[y])-1);
			}
		}
	}
}

版权声明: https://blog.csdn.net/Deep_Kevin/article/details/79950176

[SDOI2009]E&D,洛谷之提高历练地,博弈论(3-6)

正题      第四题:[SDOI2009]E&amp;amp;D      这题不是如此的简单,因为它要涉及到找规律和Sg函数。      首先的,我们可以打一个表来观察之间的关系。      Sg...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-08 13:48:45
  • 11

SuperGCD,洛谷之提高历练地,数论(3-5)

前话      数论就是研究整数的理论。包括公约公倍数、质数、欧拉定理和同余方程等。正文       其实数论不止那么简单正文      第一题:SuperGCD      这一题就是很烦的代码加很烦...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-07 17:19:43
  • 9

NOI2002银河英雄传说(带边权的并查集)

!!带边权的并查集 有时a与b之间的关系比较复杂,比如关系式有向的,或者关系是一个数。这时想要知道两者之间的关系,首先要通过代表元是否相同来知道这两者的关系能否确定,若能确定,再根据两者分别和根节点...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016-03-15 21:32:49
  • 2007

[NOI2002]银河英雄传说(并查集)

【题解】 建立并查集,并维护每个结点到root的距离、每个连通块中结点的个数sum  "M i j"即:将father(i)到root的距离改为 sum[father(y)],将sum[fathe...
  • cjk_cjk
  • cjk_cjk
  • 2015-06-29 17:14:41
  • 758

COGS 260. [NOI2002] 银河英雄传说 解题报告

260. [NOI2002] 银河英雄传说 【问题描述】     公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓...
  • Janis_z
  • Janis_z
  • 2016-09-28 11:21:25
  • 583

食物链,洛谷之提高历练地,并查集

正文      第二题:食物链      这题经典啊!!!我们可以想象,如果我们可以搞一个并查集来维护x的同伙,天敌和食物就好了。      我们想到了开三倍空间来维护x的天敌,同伙和食物。     ...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 15:57:03
  • 15

洛谷 P1196 NOI2002 银河英雄传说

并查集 NOI2002
  • SilverNebula
  • SilverNebula
  • 2016-05-14 11:51:36
  • 422

【NOI2002】银河英雄传说

Overview有M=30000M=30000个点,NN个操作(N≤500000N\leq 500000)。 每次操作如下: (1)MM ii jj:将ii所在的排列合并到jj所在的排列; (2...
  • y20070316
  • y20070316
  • 2016-01-29 16:39:49
  • 525

【NOI2002】caioj1095: 并查集4(银河英雄传说)

1095: 并查集4(银河英雄传说) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 【问题描述】 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,...
  • tycer
  • tycer
  • 2017-07-25 15:39:38
  • 194

银河英雄传说(并查集)

题意:传说杨wl为了打宇宙大战,然后搞了一个舰队,一开始用一字整形,然后为了战斗,就要调整队形,他可以把i行舰队的所有飞船都搞到j行去。 同时他也想知道两个飞船之间有多少飞船。 如果不在同一行就输...
  • qq872425710
  • qq872425710
  • 2016-12-17 11:45:34
  • 238
收藏助手
不良信息举报
您举报文章:[NOI2002]银河英雄传说,洛谷之提高历练地,并查集
举报原因:
原因补充:

(最多只允许输入30个字)