题目链接:http://poj.org/problem?id=1988

题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面。 第二种是C(x),意思是数x方块下面有多少个方块。

把两堆合成一堆,这个可以用并查集来实现,问题是,怎么样维护x方块下面有多少个方块呢?

先来分析一下题目,按照样例,我们有6个方块,1,2,3,4,5,6。

令Cnt(x) = C(x)+1。

先执行M(1,6),此时Cnt(1) = 2, Cnt(6) = 1

再执行M(2,4),此时Cnt(2) = 2, Cnt(4) = 1

接下来我们执行M(2,6),此时Cnt(2) = 4, Cnt(4) = 3。

注意到了没有,意思也就是说我们给2和4每一个都增加了Cnt(1)

我们可以利用类似线段树的懒惰标记思想,给方块2加上2点“懒惰值”,然后需要读取4的值的时候,我们再把它统计进来。

由于并查集记录的是父亲节点,因此我们需要把树反着来,也就是说,2摞在6上面,在并查集中,6是2的父亲。

代码:

 #include <cstdio>
#include <algorithm>
#include <bitset>
#include <set>
#include <vector>
#include <iterator>
#include <cstring>
#include <map>
#include <cctype>
using namespace std; const int MAX_N = +;
int f[MAX_N],lazy[MAX_N],sum[MAX_N]; void init(){
for(int i=;i<=MAX_N;i++){
f[i] = i;
lazy[i] = ;
sum[i] = ;
}
} int find(int x){
if( f[x] == x ) return x;
int t = find(f[x]);
lazy[x] += lazy[f[x]];
return f[x] = t;
} void merge(int x,int y){
int fx = find(x) , fy = find(y);
if( fx==fy ) return;
lazy[fx]+=sum[fy];
sum[fy]+=sum[fx];
sum[fx] = ;
f[fx] = fy;
} int main(){
int P,X,Y;
char cmd[];
scanf("%d",&P);
init();
while(scanf("%s",cmd)!=EOF){
if( cmd[]=='M' ) {
scanf("%d%d",&X,&Y);
merge(X,Y);
} else {
scanf("%d",&X);
find(X);
printf("%d\n",lazy[X]);
}
// for(int i=1;i<=P;i++){
// printf("lazy[%d]=%d, sum[%d]=%d\n",i,lazy[i],i,sum[i]);
// }
} return ;
}

[POJ 1988] Cube Stacking (带值的并查集)的更多相关文章

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

    哈哈,一次AC. 题意:给你 1-n 编号的立方体,然后移动包含指定编号的立方体的堆移到另一个堆上边, 询问指定的编号立方体下面有多少个立方体. 思路:由于并查集是存储的是它的父亲,那么只能从父亲那里 ...

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

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

  3. POJ 1988 Cube Stacking(并查集+路径压缩)

    题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...

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

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 23678   Accepted: 8299 Ca ...

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

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

  6. poj.1988.Cube Stacking(并查集)

    Cube Stacking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submi ...

  7. POJ 1988 Cube Stacking (种类并查集)

    题目地址:POJ 1988 这道题的查找合并的方法都能想的到,就是一点没想到,我一直天真的以为查询的时候,输入后能立即输出,这种话在合并的时候就要所有的结点值都要算出来,可是经过路径压缩之后,没办法所 ...

  8. POJ 1988 Cube stacking【并查集高级应用+妙用deep数组】

    Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes ...

  9. poj 1182 食物链 (带关系的并查集)

      食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...

随机推荐

  1. 在 Ubuntu 14.04 中配置 PXE 服务器

    PXE(预启动执行环境Preboot Execution Environment)服务器允许用户从网络中启动 Linux 发行版并且可以不需要 Linux ISO 镜像就能同时在数百台 PC 中安装. ...

  2. js 中混乱this

    1.在HTML元素事件属性中inline方式使用this关键字:  <div onclick=" // 可以在里面使用this ">division element&l ...

  3. 2016 - 1 - 24 NSURLSession (一)

    一: NSURLSession简介 1.实施步骤 1.1 使用 NSURLSession对象 创建TASK ,然后执行TASK 2.TASK的类型: 二: NSURLSession的简单使用: - ( ...

  4. linux系统下php安装mbstring扩展的二种方法

    .执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...

  5. 大量无线键盘存在KeySniffer漏洞-可嗅探用户输入的内容

    几美元的一根天线.一个无线发射器,还有几行Python代码,有了这些,黑客就可以在几十米开外主动地记录下你的用户名.密码.信用卡.你写的稿子,总之就是你用无线键盘输入的任何东西. 黑客所利用的是一种无 ...

  6. Certificate、Provisioning Profile、App ID

    关于 Certificate.Provisioning Profile.App ID 的介绍及其之间的关系 2014-03-13 15:26 13416人阅读 评论(1) 收藏 举报   目录(?)[ ...

  7. 基于Twemproxy的Redis集群搭建以及想法

    基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...

  8. 三部曲二(基本算法、动态规划、搜索)-1006-The Same Game

    The Same Game Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4585   Accepted: 1699 Des ...

  9. jquery ajax error函数详解

    代码:$(document).ready(function() {            jQuery("#clearCac").click(function() {        ...

  10. git error

    一,今天在上传代码时出错: $ git push -u origin mastererror: The requested URL returned error: 403 Forbidden whil ...