分别将x、y坐标排序之后统计有效小矩形即可。这类题目也可以加上线段树优化,可是这道题的数据范围仅仅为n<=100,是可以不用线段树的,直接统计也能AC.

CODE

Program Atlantis;//By_Thispoet
Const
	maxn=300;
Var
	i,j,k,m,n,p,q							:Longint;
	ans										:Extended;
	x,y,hx,hy								:Array[1..maxn]of Extended;
	rankx,ranky								:Array[1..maxn]of Longint;
	rex,rey									:Array[1..maxn,0..1]of Longint;
	flag									:Array[1..maxn,1..maxn]of Boolean;

Procedure Qsortx(l,r:Longint);
var i,j,temp:Longint;
    tmp,k:Extended;
begin
	i:=l;j:=r;k:=hx[(i+j)>>1];
	repeat
		while hx[i]<k do inc(i);
		while hx[j]>k do dec(j);
		if i<=j then
			begin
				temp:=rankx[i];rankx[i]:=rankx[j];rankx[j]:=temp;
				tmp:=hx[i];hx[i]:=hx[j];hx[j]:=tmp;
				inc(i);dec(j);
			end;
	until i>j;
	if l<j then Qsortx(l,j);
	if i<r then Qsortx(i,r);
end;


Procedure Qsorty(l,r:Longint);
var i,j,temp:Longint;
    tmp,k:Extended;
begin
	i:=l;j:=r;k:=hy[(i+j)>>1];
	repeat
		while hy[i]<k do inc(i);
		while hy[j]>k do dec(j);
		if i<=j then
			begin
				temp:=ranky[i];ranky[i]:=ranky[j];ranky[j]:=temp;
				tmp:=hy[i];hy[i]:=hy[j];hy[j]:=tmp;
				inc(i);dec(j);
			end;
	until i>j;
	if l<j then Qsorty(l,j);
	if i<r then Qsorty(i,r);
end;


BEGIN
	readln(n);
	q:=0;
	while n<>0 do
		begin
			inc(q);
			fillchar(flag,sizeof(flag),0);
			for i:=1 to n do
				begin
					readln(x[i],y[i],x[i+n],y[i+n]);
					hx[i]:=x[i];hx[i+n]:=x[i+n];
					hy[i]:=y[i];hy[i+n]:=y[i+n];
					rankx[i]:=i;rankx[i+n]:=i;
					ranky[i]:=i;ranky[i+n]:=i;
				end;
			Qsortx(1,n<<1);
			Qsorty(1,n<<1);
			fillchar(rex,sizeof(rex),255);
			fillchar(rey,sizeof(rey),255);
			for i:=1 to n<<1 do
				begin
					if rey[ranky[i],0]=-1 then rey[ranky[i],0]:=i else rey[ranky[i],1]:=i;
					if rex[rankx[i],0]=-1 then rex[rankx[i],0]:=i else rex[rankx[i],1]:=i;
				end;
			for i:=1 to n do
				for j:=rex[i,0]+1 to rex[i,1] do
					for k:=rey[i,0]+1 to rey[i,1] do
						flag[j,k]:=true;
			ans:=0;
			for i:=2 to n<<1 do
				for j:=2 to n<<1 do
					if flag[i,j] then ans:=ans+(hx[i]-hx[i-1])*(hy[j]-hy[j-1]);
			writeln('Test case #',q);
			writeln('Total explored area: ',ans:0:2);
			writeln;
			readln(n);
		end;
END.