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

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

#include <cstdio>
#include <cstring>
const int N=30050;
int h[N],f[N],size[N];
char s[2];
inline int find(int x){
    if(f[x]==x)return x;
    int temp=f[x];f[x]=find(f[x]);
    if(temp!=f[x])h[x]+=h[temp];
    return f[x];
}
inline void Unit(int x,int y){
    h[find(x)]=size[find(y)];
    size[find(y)]+=size[find(x)];
    f[find(x)]=find(y);
}
int main(){
    int T,x,y;scanf("%d",&T);
    for(int i=0;i<N;i++)f[i]=i,size[i]=1,h[i]=0;
    while(T--){
        scanf("%s",s);
        if(s[0]==‘M‘)scanf("%d%d",&x,&y),Unit(x,y);
        else scanf("%d",&x),find(x),printf("%d\n",h[x]);
    }
}
时间: 2024-12-06 09:16:35

【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集的相关文章

【poj 1988】Cube Stacking(图论--带权并查集 模版题)

题意:有N个方块,M个操作{“C x”:查询方块x上的方块数:“M x y”:移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法:带权并查集.每堆方块作为一个集合,维护3个数组:fa[x]表示x方块所在堆的最顶部的方块:d[x]表示x方块所在堆的最底部的方块:f[x]表示x方块方块x上的方块数. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<

POJ 1988 Cube Stacking 【带权并查集】

<题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所在stack中,在x之下的cube的个数. 解题分析:由于要实现大量数的移动和归属关系,所以想到可能要用并查集,但是毫无疑问,普通的并查集不能够实现统计在x下的cube个数这一功能,所以我们通过带权并查集来实现,每一个stack,以最高的点为根,然后每一个点维护两个权值,它的子树节点个数(包括它自身),和它到

POJ1988-Cube Stacking(带权并查集)

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18858   Accepted: 6547 Case Time Limit: 1000MS Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start w

「带权并查集」奇偶游戏

奇偶游戏 原题链接:奇偶游戏 题目大意 给你N个区间,每个区间给你它含1的奇偶性,问你哪些询问逻辑上冲突 题目题解 一道带权并查集的题,让我对带权并查集有了更深入的理解,带权并查集可以分为两种(在这道题中) "边带权"并查集 "扩展域"并查集 两种方法都是思维上的不同所造成的,其中第一种解法是最常见的,第二种解法在代码实现上是最简单的,我们先来对第一种进行探究 边带权,很明显,我们要在并查集的边上进行一个储存边权的操作,我们这里用d来表示当前节点到根节点的Xor值,

luogu P5092 [USACO2004OPEN]Cube Stacking 方块游戏

题目描述 约翰和贝茜在玩一个方块游戏.编号为 1…n 1\ldots n 1…n 的 n n n ( 1≤n≤30000 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出 P P P ( 1≤P≤100000 1 \leq P \leq 100000 1≤P≤100000 )个指令.指令有两种: 移动(M):将包含X的立方柱移动到包含Y的立方柱上. 统计(C):统计含X的立方柱中,在X下方的方块数目. 写个程序帮贝

POJ 1988 Cube Stacking (带权并查集)

Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There are two typ

Cube Stacking P0J 1988(加权并查集)

Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There

POJ 1988 Cube Stacking(带权并查集)

题意: 给定 n 个 方块, 然后有 p 个操作 操作M (a , b) , 就是将a方块所在的那一堆方块放到 b 上面. 操作C (x) , 就是询问x方块下面有多少方块 分析: 记录方块到父亲的距离dis, 还有最底的方块的cnt. 两个方块合并时,合并方块堆的父亲dis += 最底方块堆的cnt ,最底的方块堆的cnt 加上合并方块堆的 cnt 那么对于每个询问, 只要做一次路径压缩, 从根节点一直更新到询问点, 那么就能更新出询问点的长度 代码: 1 #include <bits/std

POJ 1988 Cube Stacking (带权并查集)

题目链接:http://poj.org/problem?id=1988 有n个元素,开始每个元素自己 一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈.第二种操作是询问含有x元素下面有多少个元素. 经典的带权并查集,cnt表示包含这个元素的集合中所有元素个数,dis表示这个元素离最上面元素的个数(距离). 看代码领会一下吧. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio>