码迷,mamicode.com
首页 > 其他好文 > 详细

【HDOJ3047】Zjnu Stadium(带权并查集)

时间:2017-08-17 21:29:06      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:多少   sign   break   eof   思路   pre   logs   procedure   多行   

题意:浙江省第十二届大学生运动会在浙江师范大学举行,为此在浙师大建造了一座能容纳近万人的新体育场。 
观众席每一行构成一个圆形,每个圆形由300个座位组成,对300个座位按照顺时针编号1到300,且可以认为有无数多行。现在比赛的组织者希望观众进入场地的顺序可以更加的有趣,在门票上并没有规定每个人的座位,而是与这个圈中某个人的相对位置,可以坐在任意一行。 
门票上标示的形式如下:A B x 表示第B个人必须在A的顺时针方向x个位置(比如A坐在4号位子,x=2,则B必须坐在6号位子)。 
现在你就座位志愿者在入场口检票。如果拿到一张门票,与之前给定的矛盾,则被视为是假票,如果无矛盾,视为真票。现在给定该行入场观众的顺序,以及他们手中的门票,请问其中有多少假票? 

第一行两个数N(1<=N<=50,000)和m(1<=m<=100,000)。表示N个人,m张票。

思路:复习下带权并查集的模板

dis[x]代表路径压缩后到根结点的距离

合并集合时新的dis可以使用向量运算求出

 1 var f,dis:array[1..60000]of longint;
 2     n,m,i,u,v,x,y,z,ans:longint;
 3 
 4 function find(k:longint):longint;
 5 var x:longint;
 6 begin
 7  if k=f[k] then exit(k);
 8  x:=f[k];
 9  f[k]:=find(f[k]);
10  dis[k]:=(dis[k]+dis[x]) mod 300;
11  exit(f[k]);
12 end;
13 
14 procedure union(x,y,z:longint);
15 var u,v:longint;
16 begin
17  u:=find(x); v:=find(y);
18  f[v]:=u;
19  dis[v]:=(dis[x]+z-dis[y]+300) mod 300;
20 end;
21 
22 begin
23  assign(input,hdoj3047.in); reset(input);
24  assign(output,hdoj3047.out); rewrite(output);
25  while not eof do
26  begin
27   readln(n,m);
28   if (n=0)and(m=0) then break;
29   ans:=0;
30   for i:=1 to n do
31   begin
32    f[i]:=i; dis[i]:=0;
33   end;
34   for i:=1 to m do
35   begin
36    readln(x,y,z);
37    u:=find(x); v:=find(y);
38    if u<>v then union(x,y,z)
39     else if (dis[x]+z) mod 300<>dis[y] then inc(ans);
40   end;
41   writeln(ans);
42  end;
43  close(input);
44  close(output);
45 end.

 

【HDOJ3047】Zjnu Stadium(带权并查集)

标签:多少   sign   break   eof   思路   pre   logs   procedure   多行   

原文地址:http://www.cnblogs.com/myx12345/p/7384144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!