题目链接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. logstash json和rubydebug 第次重启logstash都会把所有的日志读完 而不是只读入新输入的内容

    查看一下agent端的shipper的配置: # cat logstash_test2.shipper.conf input { file { path => ["/apps/logs ...

  2. Clr Via C#读书笔记----基元线程同步构造

    线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...

  3. 数据结构和算法 – 10.集合

    集合: 联合.交叉.差异.子集 using System; using System.Collections; using System.Collections.Generic; using Syst ...

  4. 与你相遇好幸运,Linux常用命令

    开机挂载硬盘 cat  /etc/fstab /dev/sda1  /mnt/sda1 ext3    defaults    0  0 挂载硬盘 mount  /dev/sdb5 /home/dis ...

  5. C#关键字params

    using System; using System.Threading; namespace Test { /// <summary> /// params用法: 1.用来修饰方法的参数 ...

  6. 重温WCF之数单向通讯、双向通讯、回调操作(五)

    一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...

  7. 【20140113】package 与 import

    一个完整的java源程序应该包括下列部分: package语句: //该部分至多只有一句,必须放在源程序的第一句 import语句: public classDefinition: //公共类定义部分 ...

  8. T-SQL 常用语句

    1. 查看 Table 或者 Column 被那些object(存储过程.函数或View)调用. select a.* from sysobjects a, syscomments b where a ...

  9. Spring XML配置文件示例(二)——web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" ...

  10. VS2015 Xamarin for iOS

    VS2015环境配置 VS2015安装不多说.其实Xamarin 和微软感觉并不是什么好基友,Xamarin以前一直像个可怜的娃,以插件的形式寄生于VS中.现在只不过形势稍微好点了,VS2015 在明 ...