题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376

题目大意:

编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.

有P(1≤P≤100000)个指令.指令有两种:

1.移动(M):将包含X的立方柱移动到包含Y的立方柱上.

2.统计(C):统计名含X的立方柱中,在X下方的方块数目.

题解:

带权并查集

存三个东西,x所在立方柱的最顶端fa[x],x所在立方柱的最底端d[x],x上面有多少个立方柱f[x](下面的图画错了不包含x qwq..画的时候一点感觉都没有)。

那么要求的x下方的数目就可以用f[d[x]]-f[x]来表示。

/*
题意:
n块积木,m个操作或询问。每次移动积木的时候,约翰会选择两块积木X,Y,把X搬到Y的上方。如果X已经和其它积
木叠在一起了,那么应将这叠积木整体移动到Y的上方;如果Y已经和其它积木叠在一起了的,假设在Y上方最高处的
积木为Z,那么应将X所在的那叠积木移动到Z的上方。每次询问当前时刻,某一块积木的下方有多少块积木。
n,m<=10^5
输入第一行 一个整数m,接下来m行,每行命令的格式为: 操作 x y ( M 为合并操作,C为查询 ) 题解:
带权并查集。
对于每个点x,维护当前所在并查集(也就是这一堆积木中)最下方的积木low[x],最上方的积木fa[x],
x到最上方积木的距离dist[x],则下方的积木数=dist[low[x]]-dist[x]。
带权并查集其实就是在Findfa的时候顺便维护一些权值。
*/
#include<cstdio>
#include<cstring> const int maxn=30000;
int fa[maxn],low[maxn],dist[maxn],N,M; int Findfa(int x)
{
if(fa[x]!=x)
{
int y=fa[x];
fa[x]=Findfa(fa[x]);
low[x]=low[y];
dist[x]=dist[x]+dist[y]; // x上方木块数=原x积木堆上方的木块数 + Findfa更新后原积木堆x祖先y上方木块数
}
return fa[x];
} int main()
{
for(int i=1;i<=maxn;++i) fa[i]=i,low[i]=i,dist[i]=0; // 并查集初始化
scanf("%d",&M);
char op[5];
int x,y;
while(M>0)
{
M--;
scanf("%s",&op);
if(op[0]=='M') //把 x放到y上
{
scanf("%d%d",&x,&y);
int fx=Findfa(x),fy=Findfa(y);
fa[fy]=fx;
dist[fy]=dist[low[fx]]+1;
low[fx]=low[fy];
Findfa(fy); // 并查集路径压缩,更新之前积木堆y中的积木最上方的积木编号
}
else
{
scanf("%d",&x);
int t=Findfa(x);
int d=low[t];
Findfa(d); // 路径压缩,更新
printf("%d\n",dist[d]-dist[x]);
}
}
return 0;
}

bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集的更多相关文章

  1. 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集

    这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...

  2. BZOJ 3376 [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)

    题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #in ...

  3. 洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)

    题目描述 约翰和贝茜在玩一个方块游戏.编号为 1\ldots n 1-n 的 n n ( 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始 ...

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

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

  5. bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...

  6. [Usaco2004 Open]Cube Stacking 方块游戏

    题面:     约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.    游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令.指令有两种 ...

  7. BZOJ3376: [Usaco2004 Open]Cube Stacking 方块游戏

    [传送门:BZOJ3376] 简要题意: 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P≤100000 ...

  8. 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏

    算是挺基础的东西 Description     约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.    游戏开始后,约翰会给贝茜发出P(1≤P ...

  9. Cogs 1070. [焦作一中2012] 玻璃球游戏 带权并查集,逆序处理

    题目: http://cojs.tk/cogs/problem/problem.php?pid=1070 1070. [焦作一中2012] 玻璃球游戏 ★   输入文件:marbles.in   输出 ...

随机推荐

  1. js instanceof 检测某个对象是否是另一个对象的实例

    例如File对象 $("#file").change(function(){ console.log($(this)[0].files[0]) console.log($(this ...

  2. windows_agent 添加

    一:复制windows agent文件和.exe文件到c:\zabbix\目录下 二:配置zabbix_agentd.win.conf文件 hostname:设置为自定义名称,但是要和zabbix-s ...

  3. 天财商龙SQL查询ID登陆POS情况

    SELECT * FROM [tcgem_client0001].[dbo].[TCB_POS] ' --查询ID登陆POS情况

  4. 【C++ Primer | 15】继承的构造函数

    继承的构造函数 子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cl ...

  5. ElasticSearch简要总览

    今天看了一下ElasticSearch的相关文档,我做了如下总结: 发现越来越喜欢画图归纳总结知识了,看图说话 集群特性说明 健康状况的说明 如何配置分片? 接下来一张图总结下操作相关的总结 接下来, ...

  6. Java判断不为空的工具类总结

    1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. package com.bie.util; import java.util.Collection; imp ...

  7. hihocoder 前两题思路

    1800 : 玩具设计师 二维前缀和的写法有很多,最常见的是s[x-1][y]+s[x][y-1]-s[x-1][y-1]+a[x][y]; 涉及二维矩阵求和,联想前缀和,求>=指定面积的最大耐 ...

  8. C 语言的 GCC 扩展

    GNU 编译器(GCC)提供了很多 C 语言扩展,编译器会使用该信息生成更高效的机器代码. 内联函数 static inline __attribute__ ((always_inline)) int ...

  9. js条件语句初步练习

    var a=18            if(a<10){                alert("便宜")            }            else{  ...

  10. net core体系-web应用程序-4net core2.0大白话带你入门-2asp.net core新建项目

    新建asp.net core项目   开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建 ...