cubes(并查集)——(用了两种方法)

题目大意:

FJ 和Best 用 N (1 <= N <= 30,000)块相同的小立方块玩游戏,小方块编号为 1..N。开始时,小
方块都单独分开的, 每个看成一个柱子, 即有 N 柱子。 FJ 要 Best做 P(1 <= P <= 100,000) 个
操作,操作有两种类型:
(1) FJ 要求Best 把X 号方块所在的柱子放到 Y号所在的柱子上面,成一个新柱子。
(2)FJ 要求Best 计算 X 号方块所在柱子,它下面有多少个小方块。

请编个程序,帮助 Bet 计算。

输入格式:
*第一行:一个整数 P
*第 2..P+1行:第 i+1行表示第 i个FJ要求的合法操作。如果这行以'M'开头,后面有两个整
数 X,y 表示要进入(1)操作。 如果这行以'C'开头,后面有一个整数 X,表示要求计算 X所在
柱子下面的方块个数。

注:所有操作都是合法的。N 并没有出现在输入文件中。

输出格式:
依次要求计算的值,每次一行。

输入样例 (cubes.in):

6 | 6 个操作
M 1 6 | 1,6 / 2 / 3 / 4 / 5 把 1放在 6 上面。
C 1 | 输出:1
M 2 4 | 1,6 / 2,4 / 3 / 5
M 2 6 | 2,4,1,6 / 3 / 5
C 3 | 输出 :0
C 4 | 输出: 2

输出样例(cubes.out):

1
0
2

————————————————————————————————————————————————————————————————

并查集的题目- -,然后主要是超时的问题(经过优化以后,两个都AC了),我写了两个,一个用的是指针,一个用的是静态数组。

指针的玩小数据不如静态数组,静态数组的玩大数据不如指针,不知道是什么原因。求大牛解释。。。。。。。。

指针:

 1 program cubes;
 2 type
 3         point=^rec;
 4         rec=record
 5                 num,data:longint;
 6                 next,past:point;
 7                 end;
 8         arr=array[0..30000]of point;
 9 var
10         i,n:longint;
11         ch:char;
12         s,t,w:arr;
13 procedure move;
14 var
15         m,a,b:longint;
16         p,q:point;
17 begin
18         read(a,b);
19         while t[a]^.past<>nil do
20         begin
21          t[a]:=t[t[a]^.data];
22         end;
23         while w[b]^.next<>nil do
24          w[b]:=w[w[b]^.data];
25         p:=t[a];
26          m:=w[b]^.num+1;
27          while p<>nil do
28          begin
29          p^.num:=p^.num+m;
30          p:=p^.next;
31          end;
32         t[a]^.data:=a;
33         w[b]^.data:=b;
34         t[a]^.past:=w[b];
35         w[b]^.next:=t[a];
36         w[b]:=w[a];
37         t[a]:=t[b];
38 end;
39 {===============================================================}
40 procedure find;
41 var
42         a:longint;
43 begin
44         read(a);
45         writeln(s[a]^.num);
46 end;
47 {======================main=====================================}
48 begin
49         assign(input,'cubes.in');
50         assign(output,'cubes.out');
51         reset(input);
52         rewrite(output);
53         read(n);
54         for i:=1 to 30000 do
55                 begin
56                 new(s[i]);
57                 s[i]^.num:=0;
58                 s[i]^.next:=nil;
59                 s[i]^.past:=nil;
60                 end;
61         for i:=1 to 30000 do
62                 begin
63                 w[i]:=s[i];
64                 t[i]:=s[i];
65                 end;
66         while not eof do
67                 begin
68                 read(ch);
69                 if ch='M'then
70                     move
71                 else if ch='C'then
72                     find;
73                 end;
74         close(input);
75         close(output);
76 end.                                        

 

静态数组

 1 program cubes;
 2 type
 3         arr=array[0..30000]of longint;
 4 var
 5         i,j,p:longint;
 6         ch:char;
 7         num,high,fa:arr;
 8 function findfa(a:longint):longint;
 9 begin
10         while fa[a]<>a do a:=fa[a];
11         exit(a);
12 end;
13 {============================================}
14 procedure move;
15 var
16         a,b:longint;
17 begin
18         read(a,b);
19         a:=findfa(a);
20         b:=findfa(b);
21         high[a]:=num[b];
22         num[b]:=num[b]+num[a];
23         fa[a]:=fa[b];
24 end;
25 {============================================}
26 function find(a:longint):longint;
27 var
28         i:longint;
29 begin
30         i:=0;
31         find:=0;
32         if fa[a]<>a then
33         while fa[a]<>a do
34                 begin
35                 find:=find+high[a];
36                 a:=fa[a];
37                 end
38         else exit(high[a]);
39 end;
40 {============================================}
41 
42 begin
43         assign(input,'cubes.in');
44         assign(output,'cubes.out');
45         reset(input);
46         rewrite(output);
47         read(p);
48         for i:=1 to 30000 do
49                 fa[i]:=i;
50         for i:=1 to 30000 do
51                 num[i]:=1;
52         fillchar(high,sizeof(high),0);
53         while not eof do
54                 begin
55                 read(ch);
56                 if ch='M'then move
57                 else if ch='C' then begin
58                                 read(j);
59                                 writeln(find(j));
60                                 end;
61                 end;
62         close(input);
63         close(output);
64 end.                       

 

posted @ 2013-01-26 09:36  改名字干什么  阅读(754)  评论(0编辑  收藏  举报