【BZOJ】 2049 SDOI洞穴探险 【乱搞】

| OI, CSDN

不知怎么回事我的电脑上BZOJ挂了,鞠大神的oj也挂了。。。。。

本来要用LCT,但书上说乱搞就不T,我之前却T了,于是我感叹BZOJ数据质量真好。。。然后就没有然后了

直到今天我又看到一个神犇说,乱搞比LCT还快,于是我不自量力地又交了一遍,还是T,于是我开始对拍

等到我把该死的inline去掉之后,一切歌舞升平,于是我再交,依然T

继续拍,发现了抄书上伪代码的改指针不对,再交,T

继续拍,直到300W次之后,小数据卡死了。我黔驴技穷,看标程,那个递归的evert让我原形毕露。真是呵呵

我自以为是的非递归还是又出错了。。呵呵。。


var
	f:array[0..10001]of longint;
	i,j,n,m,x,y:longint;
	c:char;
	
function root(i:longint):longint;
	begin
		while f[i]<>0 do i:=f[i];
		exit(i);
	end;
	
{
procedure evert(i:longint);
	var t:longint;
	begin
		while f[i]<>0 do begin t:=f[i];f[i]:=f[f[i]];f[t]:=i;end;
	end;
}

procedure evert(i:longint);
	begin
		if f[i]=0 then exit;
		evert(f[i]);
		f[f[i]]:=i;
	end;

	
procedure connect(x,y:longint);
	begin
		evert(y);
		f[y]:=x;
	end;
	
procedure destroy(x,y:longint);
	begin
		if f[x]=y then f[x]:=0 else f[y]:=0;
	end;

procedure query(x,y:longint);
	begin
		if root(x)=root(y) then writeln('Yes') else writeln('No');
	end;
	
begin
	//assign(input,'in');reset(input);
	assign(input,'cave.in');reset(input);
	assign(output,'cave.out');rewrite(output);
	readln(n,m);
	for i:=1 to m do
		begin
			read(c);
			case c of
				'Q':
					begin
						for j:=1 to 4 do read(c);
						readln(x,y);
						query(x,y);
					end;
				'C':
					begin
						for j:=1 to 6 do read(c);
						readln(x,y);
						connect(x,y);
					end;
				'D':
					begin
						for j:=1 to 6 do read(c);
						readln(x,y);
						destroy(x,y);
					end;
				else runerror;
			end;
		end;
	close(input);close(output);
end.

原文地址