POJ1988 Cube stacking(非递归)

n有N(N<=30,000)堆方块,开始每堆都是一个方块。方块编号1 – N. 有两种操作:

nM x y : 表示把方块x所在的堆,拿起来叠放到y所在的堆上。

nC x : 问方块x下面有多少个方块。

n操作最多有 P (P<=100,000)次。对每次C操作,输出结果。

这题挺厉害的,真的不容易想

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 #define MAX 30007
 8 int bc[MAX],under[MAX],sum[MAX];
 9 void Init()
10 {
11     for(int i=0;i<MAX;i++) {
12         bc[i] = i;
13         sum[i] = 1;
14         under[i] = 0;
15     }
16 }
17
18 int find(int son)
19 {
20     int fa = son,ans = 0;
21
22     while(bc[fa]!=fa)
23     {
24         ans += under[fa];
25         fa = bc[fa];
26     }
27     //return fa;
28     //Path Compression
29     int temp = son,k,k1;
30     while(bc[temp]!=fa)
31     {
32         k = bc[temp];
33         bc[temp] = fa;
34         k1 = under[temp];
35         under[temp] = ans;
36         ans -= k1;
37         temp = k;
38     }
39     return fa;
40 }
41
42 void merge(int a,int b)
43 {
44     if(a == b) return ;
45     a = find(a);
46     b = find(b);
47     if(a != b){
48         bc[a] = b;
49     }
50     under[a] = sum[b];
51     sum[b] += sum[a];
52 }
53
54 int main(int argc, char const *argv[]) {
55     int p;
56     while(scanf("%d",&p)!=EOF)
57     {
58         Init();
59         char s[2];
60         int x,y,c;
61         while(p--)
62         {
63             scanf("%s",s);
64             if(s[0] == ‘M‘){
65                 scanf("%d%d",&x,&y);
66                 merge(x,y);
67             }
68             else{
69                 scanf("%d",&c);
70                 find(c);
71                 printf("%d\n",under[c]);
72             }
73         }
74     }
75     return 0;
76 }
时间: 2024-10-04 11:15:55

POJ1988 Cube stacking(非递归)的相关文章

poj1988 Cube Stacking(并查集

题目地址:http://poj.org/problem?id=1988 题意:共n个数,p个操作.输入p.有两个操作M和C.M x y表示把x所在的栈放到y所在的栈上(比如M 2 6:[2 4]放到[1 6]上为[2 4 1 6]),C x为输出x下面有几个数. 思路:并查集每个集合以栈最下面的数为根,维护两个数组num[x]表示x所在集合节点总数,count[x]表示x下方节点个数.每次查找压缩路径的时候更新count(换父节点的时候每轮都把父节点的count加给儿子,就可以一直更新到x所在栈

POJ1988 Cube Stacking (!hard)

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

POJ1988 Cube Stacking(并查集)

题目链接:http://poj.org/problem?id=1988 题意:有n个元素,开始每个元素各自在一个栈中,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈. 第二种操作是询问含有x元素下面有多少个元素. 思路: 并查集,把每一堆看作一个栈,堆的下方看作栈顶.因为当我们知道栈中元素的总数,和某元素到“栈顶”的距离, 我们就能知道这个元素下面有多少元素.合并操作的时候,始终使用在下面栈的根来做合并之后的根,这样也就达到了栈中的根是栈中的“栈顶”元素的效果,我们只需在每个“栈

poj1988 Cube Stacking

并查集的高效之处在于路径压缩和延迟更新. 在本题中需要额外维护子树的规模以及当前子树节点到跟的距离两个数组. 由于一个新的数必然是两棵树拼接而成,对于子树规模的更新直接相加即可, 对于节点到跟的距离: 我们让a树的根指向b树的根,同时更新a树根到(a+b)树根(即b树根)的距离为size_of(Tree(b))即可完成维护. http://poj.org/problem?id=1988 1 #include <cstdio> 2 #include <cstring> 3 #incl

加权并查集——(POJ1988)Cube Stacking

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 25647   Accepted: 8975 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

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

题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈. 另外一种操作是询问含有x元素以下有多少个元素. 用sum数组储存每一个栈中的元素个数.每次合并的时候将sum加到 父亲节点.也就是每一个栈的最底部. 用under数组储存当前节点以下有多少元素.每次合并的时候,就能够将顶端元素的under赋值为父节点也就是栈最底部的sum. void U

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr