分别将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.