ex.dpr

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

DPR
122
字号
{
	the online algorithm for intersection of half-plane
	look up the article in 2002 for detail
}
program Ural_1062(Input,Output);
const
	MaxP=100+4;
	MaxN=100;
	Infinite=1E10;
	Epsilon=1E-10; //if it's 1e-7 or over, it will be got WA 
type
	TIndex=Longint;
	TData=Extended;
	TPoint=record
		X,Y:TData;
	end;
	TPointSet=array[1..MaxP]of TPoint;
	TSpeedSet=array[1..MaxN]of record
		U,V,W:TData;
	end;
var
	N,M:TIndex;
	Speed:TSpeedSet;
	P:TPointSet;
function Intersect(S,T:TPoint;A,B,C:TData):TPoint;
var
	U,V:TData;
begin
	U:=Abs(A*S.X+B*S.Y+C);
	V:=Abs(A*T.X+B*T.Y+C);
	Result.X:=(S.X*V+T.X*U)/(U+V);
	Result.Y:=(S.Y*V+T.Y*U)/(U+V);
end;
function Sign(X:TData):TIndex;
begin
	if Abs(X)<Epsilon then Result:=0
	else if X<0 then Result:=-1
	else Result:=1;
end;
procedure Cut(A,B,C:TData);
var
	i:TIndex;
	Prev,Next:TIndex;
	NewM:TIndex;
	Q:TPointSet;
begin
	NewM:=0;
	if (A=0)and(B=0)and(C>=0) then
	begin
		M:=0;
		Exit;
	end;
	for i:=1 to M do
	begin
		if Sign(A*P[i].X+B*P[i].Y+C)<=0 then 
		begin
			Inc(NewM);
			Q[NewM]:=P[i];
		end
		else
		begin
			Prev:=(i-1+M-1)mod M+1;
			if Sign(A*P[Prev].X+B*P[Prev].Y+C)=-1 then
			begin
				Inc(NewM);
				Q[NewM]:=Intersect(P[Prev],P[i],A,B,C);
			end;
			Next:=(i+1+M-1)mod M+1;
			if Sign(A*P[Next].X+B*P[Next].Y+C)=-1 then 
			begin
				Inc(NewM);
				Q[NewM]:=Intersect(P[i],P[Next],A,B,C);
			end;
		end;
	end;
	M:=NewM;
	P:=Q;
end;
procedure Main;
var
	i,j:TIndex;
begin
	Readln(N);
	for i:=1 to N do
		with Speed[i] do
			Readln(U,V,W);
	for i:=1 to N do
	begin
		M:=4;
		P[1].X:=0;
		P[1].Y:=0;
		P[2].X:=Infinite;
		P[2].Y:=0;
		P[3].X:=Infinite;
		P[3].Y:=Infinite;
		P[4].X:=0;
		P[4].Y:=Infinite;
		for j:=1 to N do
			if i<>j then
			begin
				Cut(1/Speed[i].U-1/Speed[j].U,1/Speed[i].V-1/Speed[j].V,1/Speed[i].W-1/Speed[j].W);
				if M<3 then Break;
			end;
		if M>=3 then 
			Writeln('Yes')
		else
			Writeln('No');
	end;
end;
begin
{$IFNDEF ONLINE_JUDGE}
	Assign(Input,'i.txt');
	Reset(Input);
	Assign(Output,'o.txt');
	Rewrite(Output);
{$ENDIF}
	Main;
{$IFNDEF ONLINE_JUDGE}
	Close(Input);
	Close(Output);
{$ENDIF}
end.

⌨️ 快捷键说明

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