ex.dpr

来自「tongji acm-online judge solution」· DPR 代码 · 共 211 行

DPR
211
字号
program Ural_1265(Input,Output);
const
	MaxLen=20;
	Bit=1000000000;
type
	TIndex=Longint;
	TReal=Extended;
	TData=Int64;
	THP=record
		Len:TIndex;
		Sign:Boolean;
		D:array[0..MaxLen]of TData;
	end;
	TPoint=record
		x,y:THP;
	end;
var
	A,B,C,D,O:TPoint;

function AddAbs(A,B:THP):THP;
var
	i:TIndex;
	R:TData;
begin
	FillChar(Result,SizeOf(Result),0);
	with Result do
	begin
		i:=0;
		R:=0;
		while (i<=A.Len) or (i<=B.Len) or (R>0) do
		begin
			D[i]:=R;
			if i<=A.Len then Inc(D[i],A.D[i]);
			if i<=B.Len then Inc(D[i],B.D[i]);
			R:=0;
			if D[i]>=Bit then
			begin
				R:=1;
				Dec(D[i],Bit);
			end;
			Inc(i);
		end;
		Len:=i-1;
		while (D[Len]=0) and (Len>0) do Dec(Len);
		if (Len=0) and (D[0]=0) then Sign:=false;
	end;
end;
function MinusAbs(A,B:THP):THP;//A>=B
var
	i:TIndex;
	R:TData;
begin
	FillChar(Result,SizeOf(Result),0);
	with Result do
	begin
		i:=0;
		R:=0;
		while (i<=A.Len) or (R<0) do
		begin
			D[i]:=R;
			if i<=A.Len then Inc(D[i],A.D[i]);
			if i<=B.Len then Dec(D[i],B.D[i]);
			R:=0;
			if D[i]<0 then
			begin
				R:=-1;
				Inc(D[i],Bit);
			end;
			Inc(i);
		end;
		Len:=i-1;
		while (D[Len]=0) and (Len>0) do Dec(Len);
		if (Len=0) and (D[0]=0) then Sign:=false;
	end;
end;
function Compare(A,B:THP):TData;
var
	i:TIndex;
begin
	Result:=A.Len-B.Len;
	if Result<>0 then Exit;
	i:=A.Len;
	while (A.D[i]=B.D[i]) and (i>0) do Dec(i);
	Result:=A.D[i]-B.D[i];
end;
function Add(A,B:THP):THP;
begin
	if A.Sign xor B.Sign then
	begin
		if Compare(A,B)>=0 then
			Result:=MinusAbs(A,B)
		else 
		begin
			Result:=MinusAbs(B,A);
			Result.Sign:=not Result.Sign;
		end;
		if A.Sign then Result.Sign:=not Result.Sign;
	end
	else
	begin
		Result:=AddAbs(A,B);
		if A.Sign then Result.Sign:=not Result.Sign;
	end;
	with Result do
		if (Len=0) and (D[0]=0) then Sign:=false;
end;
function Minus(A,B:THP):THP;
begin
	B.Sign:=not B.Sign;
	Result:=Add(A,B);
end;
function Multiply(A,B:THP):THP;
var
	i,j:TIndex;
begin
	FillChar(Result,SizeOf(Result),0);
	with Result do
	begin
		Sign:=A.Sign xor B.Sign;
		for i:=0 to A.Len do
			for j:=0 to B.Len do
			begin
				Inc(D[i+j],A.D[i]*B.D[j]);
				Inc(D[i+j+1],D[i+j] div Bit);
				D[i+j]:=D[i+j] mod Bit;
			end;
		Len:=A.Len+B.Len;
		while D[Len+1]>0 do
		begin
			Inc(Len);
			Inc(D[Len+1],D[Len] div Bit);
			D[Len]:=D[Len] mod Bit;
		end;
		while (D[Len]=0) and (Len>0) do Dec(Len);
		if (Len=0) and (D[0]=0) then Sign:=false;
	end;
end;
function Sqr(A:THP):THP;
begin
	Result:=Multiply(A,A);
end;
function IsNonpositive(A:THP):Boolean;
begin
	Result:=(not A.Sign and (A.Len=0) and (A.D[0]=0)) or A.Sign;
end;
function Det(const A,B,C:TPoint):THP;
begin
	Result:=Minus(Multiply(Minus(B.x,A.x),Minus(C.y,A.y))
				,Multiply(Minus(B.y,A.y),Minus(C.x,A.x)));
end;
function Mirror(A,P:TPoint):TPoint;
var
	Tmp:THP;
begin
	Tmp:=Multiply(Multiply(P.x,P.y),A.y);
	Result.x:=Add(Tmp,Add(Tmp,Multiply(A.x,Minus(Sqr(P.x),Sqr(P.y)))));
	Tmp:=Multiply(Multiply(P.x,P.y),A.x);
	Result.y:=Add(Tmp,Add(Tmp,Multiply(A.y,Minus(Sqr(P.y),Sqr(P.x)))));
end;
procedure ReadPoint(var P:TPoint);
var
	x,y:TReal;
begin
	Read(x,y);
	FillChar(P,SizeOf(P),0);
	P.x.D[0]:=Round(x*1000000);
	if P.x.D[0]<0 then 
	begin
		P.x.D[0]:=-P.x.D[0];
		P.x.Sign:=not P.x.Sign;
	end;
	P.y.D[0]:=Round(y*1000000);
	if P.y.D[0]<0 then 
	begin
		P.y.D[0]:=-P.y.D[0];
		P.y.Sign:=not P.y.Sign;
	end;
end;
function MinusVector(A,B:TPoint):TPoint;
begin
	Result.x:=Minus(A.x,B.x);
	Result.y:=Minus(A.y,B.y);
end;
procedure Coefficient(var A:TPoint;B:THP);
begin
	A.x:=Multiply(A.x,B);
	A.y:=Multiply(A.y,B);
end;
procedure Main;
begin
	FillChar(O,SizeOf(O),0);
	ReadPoint(A);
	ReadPoint(B);
	ReadPoint(C);
	ReadPoint(D);
	A:=MinusVector(A,C);
	B:=MinusVector(B,C);
	C:=MinusVector(D,C);
	A:=Mirror(A,C);//Without denominator
	Coefficient(B,Add(Sqr(C.x),Sqr(C.y)));
	Coefficient(C,Add(Sqr(C.x),Sqr(C.y)));
	if IsNonpositive(Multiply(Det(O,C,A),Det(O,C,B)))
		and IsNonpositive(Multiply(Det(B,A,O),Det(B,A,C))) then
		Writeln('VISIBLE')
	else
		Writeln('INVISIBLE');
end;
begin
	Main;
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?