题目描述

公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。

宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。

杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成 3000030000 列,每列依次编号为 1, 2, …,300001,2,…,30000 。之后,他把自己的战舰也依次编号为 1, 2, …, 300001,2,…,30000 ,让第 ii 号战舰处于第 ii 列 (i = 1, 2, …, 30000)(i=1,2,…,30000) ,形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为 M_{i,j}Mi,j​ ,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。

然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。

在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令: C_{i,j}Ci,j​ 。该指令意思是,询问电脑,杨威利的第 ii 号战舰与第 jj 号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。

作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。

最终的决战已经展开,银河的历史又翻过了一页……

输入输出格式

输入格式:

第一行有一个整数 T(1 \le T \le 500,000)T(1≤T≤500,000) ,表示总共有 TT 条指令。

以下有 TT 行,每行有一条指令。指令有两种格式:

  1. M_{i,j}Mi,j​ : ii 和 jj 是两个整数 (1 \le i,j \le 30000)(1≤i,j≤30000) ,表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第 ii 号战舰与第 jj 号战舰不在同一列。

  2. C_{i,j}Ci,j​ : ii 和 jj 是两个整数 (1 \le i,j \le 30000)(1≤i,j≤30000) ,表示指令涉及的战舰编号。该指令是莱因哈特发布的询问指令。

输出格式:

依次对输入的每一条指令进行分析和处理:

如果是杨威利发布的舰队调动指令,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息;

如果是莱因哈特发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第 ii 号战舰与第 jj 号战舰之间布置的战舰数目。如果第 ii 号战舰与第 jj 号战舰当前不在同一列上,则输出 -1−1 。

输入输出样例

输入样例#1: 复制

4
M 2 3
C 1 2
M 2 4
C 4 2
输出样例#1: 复制

-1
1

说明

【样例说明】

战舰位置图:表格中阿拉伯数字表示战舰编号

这题真是妙啊。

一开始也想到了并查集,但是感觉不能路径压缩,然后就在想别的做法

其实带权并查集是可以路径压缩的!!

只要记录一下距离根节点的深度就行!

更新的时候把深度一块更新了。

话说能不能用lct做?

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<map>
#define LL long long
using namespace std;
const int MAXN = 1e6 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, fa[MAXN], dis[MAXN], siz[MAXN];
int find(int x) {
if(fa[x] != x) {
int pre = fa[x];
fa[x] = find(fa[x]);
dis[x] += dis[pre];
}
return fa[x];
}
void merge(int x, int y) {
int fx = find(x), fy = find(y);
fa[fx] = fy;
dis[fx] += siz[fy];
siz[fy] += siz[fx];
}
main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
N = read();
for(int i = ; i <= ; i++) fa[i] = i, siz[i] = ;
while(N--) {
char c = '.';
while(c != 'C' && c != 'M') c = getchar();
int x = read(), y = read();
if(c == 'M') merge(x, y);
else {
if(find(x) != find(y)) puts("-1");
else printf("%d\n", abs(dis[x] - dis[y]) - );
}
}
return ;
}

洛谷P1196 [NOI2002]银河英雄传说(带权并查集)的更多相关文章

  1. P1196 [NOI2002]银河英雄传说(带权并查集)

    这个题的题目背景很是宏大,什么宇宙战舰的都出来了.但细细一看,我们就会发现,这是带权并查集的题目,首先我们还是像之前在并查集中的操作一样,但在这里我们还是应该开数组来维护所要加的权值,两个战舰是否在同 ...

  2. NOI2002银河英雄传说-带权并查集

    [NOI2002]银河英雄传说-带权并查集 luogu P1196 题目描述 Description: 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年, ...

  3. [NOI2002] 银河英雄传说 (带权并查集)

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

  4. [洛谷P1196][NOI2002]银河英雄传说 - 带偏移量的并查集(1)

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

  5. NOI2002银河英雄传说——带权并查集

    题目:https://www.luogu.org/problemnew/show/P1196 关键点在于存下每个点的位置. 自己糊涂的地方:位置是相对于谁的位置? 因为每次给一个原来是fa的点赋位置时 ...

  6. 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解

    花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...

  7. luogu 1196 银河英雄传说 带权并查集

    带权并查集,其实有点像许多队列问情况的小学奥数 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<= ...

  8. 【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,

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

  9. 洛谷P1196[NOI2002]银河英雄传说-并查集扩展

    银河英雄传说 题意:在并查集的基础上,还要求出同一集合的两个点的距离 这道题用并查集自己是知道的,但是竟然可以这么骚的操作. 下面转自大佬的查详细题解 初见这道题,首先想到的方法当然是直接模拟,模拟每 ...

随机推荐

  1. redis的有序集合(Sorted Sets)数据类型

    和Sets相比,Sorted Sets增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而 ...

  2. Django的MTV模式详解

    参考博客:https://www.cnblogs.com/yuanchenqi/articles/7629939.html 一.MVC模型 Web服务器开发领域里著名的MVC模式. 所谓MVC就是把W ...

  3. 2018.10.23NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 50 + (10 \sim 50)\) 实际得分:\(100 + 10 + 50\) 这可能是我打的最懵逼的一场考试没有之一.. T1两个小时才做出来也是醉了. T ...

  4. 深度语义匹配模型-DSSM 及其变种

    转自:http://ju.outofmemory.cn/entry/316660 感谢分享~ DSSM这篇paper发表在cikm2013,短小但是精炼,值得记录一下 ps:后来跟了几篇dssm的pa ...

  5. 网络基础-IP、端口等

    首先来理解一下几个概念.      白帽子:有能力破坏电脑安全但不具恶意目的的黑客.白帽子一般有清楚的定义.道德规范并常常试图同企业合作去改善发现的安全弱点.         正义技术员. 灰帽子:对 ...

  6. solidity语言4

    引用类型(Reference Types) memory 不支持持久保存 storage 保留为变量 复杂类型如arrays和structs,有附加信息,'data location',提示存储在'm ...

  7. 启动PyCharm cannot start under Java 1.7 : Java 1.8 or later is required 解决方案

    1.安装jdk8 2.配置环境变量 JAVA_HOME : C:\Program Files (x86)\Java\jre1.8.0_144 java原本的环境变量配置不变,只修改JAVA_HOME

  8. Simotion CF卡 固件下载地址及制作方法

    SIMOTION D - Firmware (Kernel) 固件下载地址 支持中心ID:31045047 https://support.industry.siemens.com/cs/docume ...

  9. Android获取手机安装的浏览器列表

    最近碰到一个同事询问如何查询本地安装的浏览器列表,其使用的代码如下: public static List<ResolveInfo> getBrowserList(Context cont ...

  10. wireshark抓取本地回环数据包

      linux环境下,用tcpdump,可以用-i lo参数抓取环回接口的包.如果服务端和客户端安装在同一台机器上,调试时是很方便的.linux版的wireshark,选取网卡的菜单里也有lo选项,也 ...