题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2818

题目大意:每次指定一块砖头,移动砖头所在堆到另一堆。查询指定砖头下面有几块砖头。

解题思路

【HDU数据有问题】,数据从0开始,且给定n块砖头(比如1000),数据会有第1005块砖头,导致访问越界。

【解决方案】,并查集初始化范围改为0~maxn(30005)

由于只给定一块砖头,却要移动所在堆。所以需要并查集维护所在堆。

p[x]=y,即x所在堆的堆底是y,注意此时并查集是有方向的。

用under[x]维护x下面有几块砖头,sum[x]维护x所在堆一共有几块砖头。

对于移动x堆到y堆,首先对x和y的堆底两点处理,合并后,X堆、Y堆所有点的堆底都指向Y堆的堆底:

①获取x和y所在堆的堆底,即X=find(x),Y=find(y)

②under[X]=sum[Y],即合并后,X堆下面有Y堆总个数

③sum[Y]+=sum[X],由于合并后,两堆结点在路径压缩时会集体更新,所以这里只要令sum[Y]=两堆和就可以了。

③f[X]=Y,让X堆的堆底都指向Y堆堆底。

路径压缩部分:

①under[x]+=under[f[x]],即原X堆堆底以上的under,全部加上堆底under(堆底已经被手动更新)。

②f[x]=find(f[x]),堆底以上的指向更新。

#include "cstdio"
#define maxn 30005
int f[maxn],under[maxn],sum[maxn];
int find(int x)
{
if(x!=f[x])
{
int t=find(f[x]);
under[x]+=under[f[x]];
return f[x]=t;
}
else return x;
}
void Union(int x,int y)
{
x=find(x),y=find(y);
if(x!=y)
{
under[x]=sum[y];
sum[y]+=sum[x];
f[x]=y;
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n,x,y;
char cmd;
scanf("%d",&n);
for(int i=;i<maxn;i++)
{
f[i]=i;
sum[i]=;
}
for(int i=;i<=n;i++)
{
getchar();
scanf("%c",&cmd);
if(cmd=='M')
{
scanf("%d%d",&x,&y);
Union(x,y);
}
else
{
scanf("%d",&x);
find(x);
printf("%d\n",under[x]);
}
}
}

HDU 2818 (矢量并查集)的更多相关文章

  1. hdu 1116 欧拉回路+并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...

  2. Bipartite Graph hdu 5313 bitset 并查集 二分图

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset   ...

  3. hdu 3081(二分+并查集+最大流||二分图匹配)

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...

  5. hdu 3536【并查集】

    hdu 3536 题意: 有N个珠子,第i个珠子初始放在第i个城市.有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市.  Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了 ...

  6. HDU 1829 分组并查集

    题意:有两种性别,每组数据表示是男女朋友,判断输入的几组数据是否有同性恋 思路:http://blog.csdn.net/iaccepted/article/details/24304087 分组并查 ...

  7. HDU 1198(并查集)

    题意:给你11个图,每一个都有管道,然后给一张由这11个正方形中的n个组成的图,判断有几条连通的管道: 思路:在大一暑假的时候做过这道题,当时是当暴力来做的,正解是并查集,需要进行一下转换: 转换1: ...

  8. HDU 4496 D-City(并查集,逆思维)

    题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... # ...

  9. HDU 4496 D-City (并查集)

    题意:给定一个图,问你每次删除一条边后有几个连通块. 析:水题,就是并查集的运用,倒着推. 代码如下: #include <cstdio> #include <string> ...

随机推荐

  1. NYOJ题目1049自增自减

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAN0CAIAAAA4f3koAAAgAElEQVR4nO3dO3LbyNoG4H8TyrUQx1

  2. NYOJ题目839合并

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAKgCAIAAADmrHcoAAAgAElEQVR4nO3dO1LsOheG4X8S5AyE2A

  3. Lattice 的 DDR IP核使用调试笔记之DDR 的 仿真

    —— 远航路上ing 整理于 博客园.转载请标明出处. 在上节建立完工程之后,要想明确DDR IP的使用细节,最好是做仿真.然后参考仿真来控制IP 核. 仿真的建立: 1.在IP核内的以下路径找到以下 ...

  4. Python内置的HTTP协议服务器SimpleHTTPServer

    [root@ok 6FE5-D831]# python -m SimpleHTTPServer 一条命令,HTTP服务就搭起来了!!! 方便朋友下载,自己的文件!!

  5. Clr Via C#读书笔记---线程基础

    趣闻:我是一个线程:http://kb.cnblogs.com/page/542462/ 进程与线程 进程:应用程序的一个实例使用的资源的集合.每个进程都被赋予了一个虚拟地址空间. 线程:对CPU进行 ...

  6. 如何使用Case进行简单判断

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 ' T ...

  7. dblink

    drop database link "STANDARD"; drop database link "CSPS"   --创建dblink create dat ...

  8. git clean 使用方法

    删除 一些 没有 git add 的 文件: git clean 参数 -n 显示 将要 删除的 文件 和  目录 -f 删除 文件,-df 删除 文件 和 目录 git clean -n git c ...

  9. android 入门-微博分享

    [2015-03-11 13:40:32 - WeiboSDK] Unable to resolve target 'android-8' 修改project.properties  target=a ...

  10. php判断当前的访问是手机还是电脑

    <?php function check_wap() { if (isset($_SERVER['HTTP_VIA'])) return true; if (isset($_SERVER['HT ...