## 【BZOJ2049】洞穴勘测（LCT）

1.加边

2.删边

3.询问两点之间是否联通

100%的数据满足n≤10000, m≤200000

  1 var t:array[0..500000,0..1]of longint;
2     fa,rev,q:array[0..500000]of longint;
3     n,m,i,x,y,k,j,top,s:longint;
4     ch:string;
5
6 procedure swap(var x,y:longint);
7 var t:longint;
8 begin
9  t:=x; x:=y; y:=t;
10 end;
11
12 function isroot(x:longint):boolean;
13 begin
14  if (t[fa[x],0]<>x)and(t[fa[x],1]<>x) then exit(true);
15  exit(false);
16 end;
17
18 procedure pushdown(x:longint);
19 var l,r:longint;
20 begin
21  l:=t[x,0]; r:=t[x,1];
22  if rev[x]>0 then
23  begin
24   rev[x]:=rev[x] xor 1; rev[l]:=rev[l] xor 1; rev[r]:=rev[r] xor 1;
25   swap(t[x,0],t[x,1]);
26  end;
27 end;
28
29 procedure rotate(x:longint);
30 var y,z,l,r:longint;
31 begin
32  y:=fa[x]; z:=fa[y];
33  if t[y,0]=x then l:=0
34   else l:=1;
35  r:=l xor 1;
36  while not isroot(y) do
37  begin
38   if t[z,0]=y then t[z,0]:=x
39    else t[z,1]:=x;
40  end;
41  fa[x]:=z; fa[y]:=x; fa[t[x,r]]:=y;
42  t[y,l]:=t[x,r]; t[x,r]:=y;
43 end;
44
45 procedure splay(x:longint);
46 var y,z,k:longint;
47 begin
48  inc(top); q[top]:=x;
49  k:=x;
50  while not isroot(k) do
51  begin
52   inc(top); q[top]:=fa[k];
53   k:=fa[k];
54  end;
55
56  while top>0 do
57  begin
58   pushdown(q[top]);
59   dec(top);
60  end;
61
62  while not isroot(x) do
63  begin
64   y:=fa[x]; z:=fa[y];
65   if not isroot(y) then
66   begin
67    if (t[y,0]=x)xor(t[z,0]=y) then rotate(x)
68     else rotate(y);
69   end;
70   rotate(x);
71  end;
72 end;
73
74 procedure access(x:longint);
75 var last:longint;
76 begin
77  last:=0;
78  while x>0 do
79  begin
80   splay(x); t[x,1]:=last;
81   last:=x; x:=fa[x];
82  end;
83 end;
84
85 procedure makeroot(x:longint);
86 begin
87  access(x); splay(x); rev[x]:=rev[x] xor 1;
88 end;
89
91 begin
92  makeroot(x); fa[x]:=y;
93 end;
94
95 procedure cut(x,y:longint);
96 begin
97  makeroot(x); access(y); splay(y); t[y,0]:=0; fa[x]:=0;
98 end;
99
100 function findroot(x:longint):longint;
101 var k:longint;
102 begin
103  access(x); splay(x);
104  k:=x;
105  while t[k,0]<>0 do k:=t[k,0];
106  exit(k);
107 end;
108
109 begin
110  assign(input,'bzoj2049.in'); reset(input);
111  assign(output,'bzoj2049.out'); rewrite(output);
113  for i:=1 to m do
114  begin
115   readln(ch); k:=length(ch); s:=0; x:=0; y:=0; j:=1;
116   repeat
117    if (ch[j]=' ') then
118    begin
119     inc(s);
120     while ch[j]=' ' do inc(j);
121     continue;
122    end;
123    if (ch[j]>='0')and(ch[j]<='9') then
124    begin
125     case s of
126      1:x:=x*10+ord(ch[j])-ord('0');
127      2:y:=y*10+ord(ch[j])-ord('0');
128     end;
129    end;
130    inc(j);
131   until j>k;
132   case ch[1] of
134    'D':cut(x,y);
135    'Q':
136     if findroot(x)<>findroot(y) then writeln('No')
137      else writeln('Yes');
138   end;
139  end;
140
141
142  close(input);
143  close(output);
144 end.

posted on 2017-02-12 20:22  myx12345  阅读(...)  评论(... 编辑 收藏

• 随笔 - 613
• 文章 - 0
• 评论 - 4
• 引用 - 0