ex.dpr

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

DPR
149
字号
program Ural_1235(Input,Output);
const
	MaxN=100;
type
	TIndex=Longint;
	TCoordinate=array[1..MaxN+2]of TIndex;
	TPoint=record
		x,y:TIndex;
	end;
	TPointSet=array[1..MaxN]of TPoint;
	TSum=array[0..MaxN+2,0..MaxN+2]of TIndex;
var
	N:TIndex; //may be 0
	P:TPointSet;
	x,y:TCoordinate;
	Nx,Ny:TIndex;
	Sum:TSum;
	B:TPoint;
	Max:TIndex;

procedure QuickSort(var D:TCoordinate;l,r:TIndex);
var
	i,j:TIndex;
	Mid,Tmp:TIndex;
begin
	i:=l;
	j:=r;
	Mid:=D[(i+j) div 2];
	repeat
		while D[i]<Mid do Inc(i);
		while D[j]>Mid do Dec(j);
		if i<=j then
		begin
			Tmp:=D[i];
			D[i]:=D[j];
			D[j]:=Tmp;
			Inc(i);
			Dec(j);
		end;
	until i>j;
	if l<j then QuickSort(D,l,j);
	if i<r then QuickSort(D,i,r);
end;
function BinarySearch(const D:TCoordinate;Left,Right:TIndex;Key:TIndex):TIndex;
var
	Mid:TIndex;
begin
	Result:=0;
	while Left<=Right do
	begin
		Mid:=(Left+Right) div 2;
		if Key<D[Mid] then
			Right:=Mid-1
		else if Key>D[Mid] then
			Left:=Mid+1
		else
		begin
			Result:=Mid;
			Exit;
		end;
	end;
end;
procedure MakeUnique(var D:TCoordinate;var N:TIndex);
var
	NewN:TIndex;
	i,j:TIndex;
begin
	NewN:=0;
	i:=1;
	while i<=N do
	begin
		j:=i+1;
		while (D[j]=D[i]) and (j<=N) do Inc(j);
		Inc(NewN);
		D[NewN]:=D[i];
		i:=j;
	end;
	N:=NewN;
end;
procedure Update(l,i,j:TIndex);
begin
	if l<=Max then Exit;
	B.x:=x[i];
	B.y:=y[j];
	Max:=l;
end;
function GetSum(x1,y1,x2,y2:TIndex):TIndex;
begin
	if (x1>x2) or (y1>y2) then
		Result:=0
	else
		Result:=Sum[x2,y2]-Sum[x1-1,y2]-Sum[x2,y1-1]+Sum[x1-1,y1-1];
end;
procedure Main;
var
	i,j:TIndex;
	s,t:TIndex;
begin
	x[1]:=0;
	y[1]:=0;
	Readln(N,x[N+2],y[N+2]);
	for i:=1 to N do
	begin
		Readln(P[i].x,P[i].y);
		x[i+1]:=P[i].x;
		y[i+1]:=P[i].y;
	end;
	Nx:=N+2;
	QuickSort(x,1,Nx);
	MakeUnique(x,Nx);
	Ny:=N+2;
	QuickSort(y,1,Ny);
	MakeUnique(y,Ny);
	FillChar(Sum,SizeOf(Sum),0);
	for i:=1 to N do
		Inc(Sum[BinarySearch(x,1,Nx,P[i].x),BinarySearch(y,1,Ny,P[i].y)]);
	for i:=1 to Nx do
		for j:=1 to Ny do
			Inc(Sum[i,j],Sum[i,j-1]);
	for j:=1 to Ny do
		for i:=1 to Nx do
			Inc(Sum[i,j],Sum[i-1,j]);
	Max:=0;
	for i:=1 to Nx-1 do
		for j:=1 to Ny-1 do
		begin
			s:=1;
			t:=1;
			repeat
				if x[i+s]-x[i]<y[j+t]-y[j] then
				//each time expand the shorter side
				begin
					Update(x[i+s]-x[i],i,j);
					Inc(s);
				end
				else
				begin
					Update(y[j+t]-y[j],i,j);
					Inc(t);
				end;
				if (i+s>Nx) or (j+t>Ny) then Break;
				if GetSum(i+1,j+1,i+s-1,j+t-1)>0 then Break;
			until false;
		end;
	Writeln(B.x,' ',B.y,' ',Max);
end;
begin
	Main;
end.

⌨️ 快捷键说明

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