传送门

题意

有n个箱子,编号从1到n,初始时每个箱子单独为一列;

接下来有p行输入,M, x, y 或者 C, x;

对于M,x,y:表示将编号x的箱子所在的一列箱子搬到编号的y箱子所在的一列箱子上;

对于C,x:表示求箱子编号x的箱子下面有多少个箱子;

Sample Input

6

M 1 6

C 1

M 2 4

M 2 6

C 3

C 4

Sample Output

1

0

2

思路

需要创建三个数组,一个fa[i] 记录i的父亲,也就是栈的底部,一个sum[i]记录每个栈中箱子的个数(主要是记录根节点的),还有一个under[i] 用于记录当前编号i的下方有多少个箱子

初始化操作

 for( int i = 0 ; i <= n ; i ++)
{fa[i] = i ;
sum[i] = 1;
under[i] = 0;
}

merge操作

假设现在执行Merge(a,b),把a放在b的上面,我先要找出x,y的根节点,x,y,很显然fa[x]=y;

想一下 under[x] 是多少, 那肯定是旧的sum[y]的大小 ,即 under[x]=sum[y];

在想一下sum[y]怎么更新,新的sum应该等于旧的sum[y]+=sum[x];

void merge(int a,int b)
{
int x=find(a);
int y=find(b);
//把x 放到 y上 ,fa[x] =y;
if(x!=y)
{
fa[x] = y;
under[x] = sum[y];
sum[y] += sum[x];
} }

find操作

如何去修改上面合并 利用剩下的不正确的under[i]。

每个编号的under都 与移动合并前的栈 的根结点存在联系。对于当前要处理的v结点,其正确的under应该等于它合并之前的under加上它合并之前栈A的根结点的under。即under[v] += under[f[v]]。

int find(int x)
{
if(fa[x] == x)
return x;
else
{
int temp = find(fa[x]);
under[x] += under[fa[x]];
return fa[x] = temp;
} }

完整代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#define endl '\n'
using namespace std;
void IOS(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
typedef pair<int,int> PII;
typedef long long ll;
const int maxn=1e5+5;
int sum[maxn];
int under[maxn];
int fa[maxn];
int find(int x)
{
if(fa[x] == x)
return x;
else
{
int temp = find(fa[x]);
under[x] += under[fa[x]];
return fa[x] = temp;
} }
void merge(int a,int b)
{
int x=find(a);
int y=find(b);
//把x 放到 y上 ,fa[x] =y;
if(x!=y)
{
fa[x] = y;
under[x] = sum[y];
sum[y] += sum[x];
} }
char s[2];
int main(){
int t;
scanf("%d", &t);
int n = 30005;
for( int i = 0 ; i <= n ; i ++)
{fa[i] = i ;
sum[i] = 1;
under[i] = 0;
}
while(t--)
{
cin>>s;
if(s[0] == 'C')
{
int q;
scanf("%d" , &q);
find(q);//一定要更新一下,q的under可能不正确,所以必须要重新修改确认一遍
printf("%d\n" , under[q]);
}
else if(s[0] == 'M')
{
int x,y;
scanf("%d%d" , &x , &y);
merge(x , y);
}
} return 0;
}

方块栈 POJ - 1988 --带权并查集的更多相关文章

  1. poj 1182 (带权并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 71361   Accepted: 21131 Description ...

  2. poj 1733(带权并查集+离散化)

    题目链接:http://poj.org/problem?id=1733 思路:这题一看就想到要用并查集做了,不过一看数据这么大,感觉有点棘手,其实,我们仔细一想可以发现,我们需要记录的是出现过的节点到 ...

  3. POJ 1703 带权并查集

    直接解释输入了: 第一行cases. 然后是n和m代表有n个人,m个操作 给你两个空的集合 每个操作后面跟着俩数 D操作是说这俩数不在一个集合里. A操作问这俩数什么关系 不能确定:输出Not sur ...

  4. Navigation Nightmare POJ - 1984 带权并查集

    #include<iostream> #include<cmath> #include<algorithm> using namespace std; ; // 东 ...

  5. Parity game POJ - 1733 带权并查集

    #include<iostream> #include<algorithm> #include<cstdio> using namespace std; <& ...

  6. POJ 1988 Cube Stacking( 带权并查集 )*

    POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...

  7. 【poj 1988】Cube Stacking(图论--带权并查集)

    题意:有N个方块,M个操作{"C x":查询方块x上的方块数:"M x y":移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法: ...

  8. POJ 1988 Cube Stacking 【带权并查集】

    <题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所 ...

  9. 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)

    题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...

  10. 【POJ 1984】Navigation Nightmare(带权并查集)

    Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...

随机推荐

  1. [abc309 G] Ban Permutation

    G - Ban Permutation 首先看到绝对值,很烦,考虑取掉绝对值得到\(p_i\leq i-X\)或\(p_i\geq i+X\) 然后我们就自然而然有了一个暴力的想法,设\(dp[i][ ...

  2. C# 添加一个具有自定义命名空间和相同类名的静态类:Console

    using CLRConsole = System.Console; namespace ExtensionMethodsDemo { public static class Console { pu ...

  3. sqlserver 修改安装时候的目录路径-Sql server 安装目录修改

    https://blog.csdn.net/qq_25049941/article/details/90401210?utm_medium=distribute.pc_aggpage_search_r ...

  4. vuepress右侧小目录 二级目录 右侧锚点 模拟Docusaurus效果

    vuepress-plugin-anchor-right 简体中文 | English vuepress-plugin-anchor-right一款用于vuepress2.x的插件. 用于生成右侧导航 ...

  5. react开发组件并发包到npm

    Toast组件 import ReactDomCli from 'react-dom/client'; import './style.css' import React from 'react'; ...

  6. 前端开发系列057-网络篇之PHP基础语法

    一.PHP简单介绍 PHP和它的应用领域 简单介绍 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器"),是一种开源的多用途脚本语言, ...

  7. Loop 三角网格细分基于openmesh

    简介 Loop 是三角网格常用的细分算法之一. 原理基于二次B样条曲线. Image 参考链接 https://blog.csdn.net/Hachi_Lin/article/details/9034 ...

  8. PPM 文件结构介绍

    PPM 文件结构介绍 ppm 文件结构很简单分为以下几个 使用记事本打开项目即可. P3 256 256 // 表示 256 * 256 个像素 255 // RGB 每一个色彩范围是 0 - 255 ...

  9. C++线程池 基于Cpp98的实现 学习2 未完待续

    简介 用到了太多的C++11的知识点,所以,暂时学点别的再搞这个. C++11 特殊函数的认识 delete defalut在C++11的作用可以参考这篇文章 https://blog.csdn.ne ...

  10. Lebesgue Measure and Lebesgue integral

    Citation : Lee, JeongHwan, "MEASURE AND INTEGRATION" (2021). Electronic Theses, Projects, ...