初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
算是挺基础的东西
Description
Input
Output
Sample Input
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
Sample Output
0
2
题目分析
带权并查集的模板题。
之所以能够用并查集做,是因为:即便集合内每一个元素不是完全等价的,但它满足能够独立带权的性质。
嗯……如果是初学带权并查集的话还是无视上面那句话好了。学的时候还是靠代码理解,理解之后自然就会有自己对于一块方面的总结了。
对于每一个维护$dis[i]$和$sum[i]$,其中$dis[i]$表示它下面有几个方块;$sum[i]$表示它这摞方块一共有几个。维护两个量是为了方便合并时的转移。
因为这题有上下之分,所以合并过程是既不能随便合并(破坏顺序);也难以按秩合并(麻烦)。路径压缩看上去好像也不行,然而实际上可以这样操作:保留逻辑上的上下顺序(换句话说,就是我们在考虑问题时候当做它是上下有序),但是操作时就路径压缩(运行结果上来看,元素之间路径被压缩了,因此并没有上下顺序)。
这样便发现,合并时候把整摞方块的最下面方块作为根是更方便的。
#include<cstdio>
#include<cctype>
const int maxn = ; int fa[maxn],sum[maxn],dis[maxn];
int q; int get(int x)
{
if (fa[x]!=x){
int tt = fa[x];
fa[x] = get(fa[x]);
dis[x] += dis[tt];
}
return fa[x];
}
void unions(int x, int y)
{
fa[x] = y;
dis[x] += sum[y];
sum[y] += sum[x];
}
int main()
{
scanf("%d",&q);
for (int i=; i<=; i++) fa[i] = i, sum[i] = ;
for (int i=; i<=q; i++)
{
char ch = getchar();
while (!isalpha(ch)) ch = getchar();
int x,y;
if (ch=='M'){
scanf("%d%d",&x,&y);
int fx = get(x), fy = get(y);
if (fx!=fy) unions(fx, fy);
}else{
scanf("%d",&x);
get(x);
printf("%d\n",dis[x]);
}
}
return ;
}
END
初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏的更多相关文章
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...
- 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...
- bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...
- BZOJ 3376 [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #in ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
随机推荐
- 记录下java的个人测试方法
IDEA,用 JUnitGenerator V2. 0 做单元测试.. 如果是 SpringBoot,测试类上面加注解 @RunWith(SpringJUnit4ClassRunner.class) ...
- AndroidTV开发
AndroidTV的开发其实和Android的开发是一样的,现在的电视机可以安装AnroidApp
- 【NOI省选模拟】小奇的花园
「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...
- Cordova 系列之创建一个iOS项目
1.打开终端 2.输入命令 $ cd Desktop (PS:Desktop表示放在桌面,你可以选择放任意位置) 3.$ cordova create HelloWorld com.example. ...
- cobian backup 11 使用
主机和备份机器创建备份用户(bf) 在备份机器上 设置备份用户, 备份目录右键安全,添加刚刚创建的备份bf用户,并授予所有权限 设置文件夹共享,并设置共享用户为刚刚创建的bf用户 并且在高级共享设置去 ...
- bootstrapValidator 常用的验证
$("#表单ID").bootstrapValidator({ message: 'This value is not valid', excluded: [':disabled' ...
- PHP之session
p:first-child, #write > ul:first-child, #write > ol:first-child, #write > pre:first-child, ...
- (C#)asp_net调试错误解决方法收集(1)
(C#)asp_net调试错误解决方法收集(1) 2007-11-2309:20 一.异常详细信息:System.InvalidOperationException:对于不返回任何键列信息的Selec ...
- 说说SpringMVC、SpringBoot和SpringCloud三者之间的联系和区别
这个问题是我在参加一次面试晚会活动上被问到的一个问题,看标题显然很简单就能够回答出来,但是仔细一琢磨,平时蒙头苦干的我们可能缺少关注和积累,好像并不能用较专业的术语和逻辑很顺畅的表达出来,于是我简要的 ...
- substring()和substr()的使用以及区别
在JavaScript中,通常会用到截取,那所谓截取呢,其实就是要获得被截取元素的某个位置到某个位置的内容,那么JS给我提供了substring和substr这两种方法: 这两种截取的方式有什么区别呢 ...