Type
lzy=record
zx,zy,yx,yy,color:longint;
end;
Const
maxn=100000;
Var
q:array[-1..maxn]of lzy;
use:array[-1..maxn]of boolean;
ans:array[-1..2500]of longint;
n,tail,a,b,i,j:longint;
cl:boolean;
tmp:lzy;
Procedure init;
begin
tail:=0;
fillchar(a,sizeof(a),0);
fillchar(use,sizeof(use),false);
end;
Procedure enque(lx,ly,rx,ry,colorr:longint);
begin
inc(tail);
with q[tail] do
begin
zx:=lx;zy:=ly;yx:=rx;yy:=ry;color:=colorr;
end;
end;
Procedure cdzx(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.zy<=sq2.zy)and(sq1.yx>=sq2.zx)and(sq1.yy>=sq2.zy)and(sq1.yx<=sq2.yx)and(sq1.yy<=sq2.yy)then cz:=true;
if not cz then exit;
{writeln('clzx');}
use[pos]:=true;
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
enque(sq2.zx,sq1.yy,sq1.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdys(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.yx)and(sq1.zy<=sq2.yy)and(sq1.yx>=sq2.yx)and(sq1.yy>=sq2.yy)and(sq1.zx>=sq2.zx)and(sq1.zy>=sq2.zy)then cz:=true;
if not cz then exit;
{writeln('clys');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
enque(sq1.zx,sq2.zy,sq2.yx,sq1.zy,sq2.color);
cl:=true;
end;
Procedure cdzs(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.yx>=sq2.zx)and(sq1.zy<=sq2.yy)and(sq1.yy>=sq2.yy)and(sq1.yx<=sq2.yx)and(sq1.zy>=sq2.zy) then cz:=true;
if not cz then exit;
{writeln('clzs');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.yx,sq1.zy,sq2.color);
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdyx(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.yx)and(sq1.yx>=sq2.yx)and(sq1.zy<=sq2.zy)and(sq1.yy>=sq2.zy)and(sq1.yy<=sq2.yy)and(sq1.zx>=sq2.zx)then cz:=true;
if not cz then exit;
{writeln('clyx');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
enque(sq1.zx,sq1.yy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdinclude(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx>=sq2.zx)and(sq1.zy>=sq2.zy)and(sq1.yx<=sq2.yx)and(sq1.yy<=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('clin');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
enque(sq1.zx,sq2.zy,sq1.yx,sq1.zy,sq2.color);
enque(sq1.zx,sq1.yy,sq1.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdspare(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.zy<=sq2.zy)and(sq1.yx>=sq2.yx)and(sq1.yy>=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('clout');}
use[pos]:=true;
cl:=true;
end;
Procedure cdleftcover(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.yx<=sq2.yx)and(sq1.yx>=sq2.zx)and(sq1.zy<=sq2.zy)and(sq1.yy>=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cleftcover');}
use[pos]:=true;
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdrightcover(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx>=sq2.zx)and(sq1.zx<=sq2.yx)and(sq1.yx>=sq2.yx)and(sq1.zy<=sq2.zy)and(sq1.yy>=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('crightcover');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cddowncentre(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx>=sq2.zx)and(sq1.zx<=sq2.yx)and(sq1.yx<=sq2.yx)and(sq1.zy<=sq2.zy)and(sq1.yy>=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cdowncentre'); }
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdupdown(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx>=sq2.zx)and(sq1.zx<=sq2.yx)and(sq1.zy>=sq2.zy)and(sq1.zy<=sq2.yy)and(sq1.yx<=sq2.yx)and(sq1.yy>=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cupdown');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
enque(sq1.zx,sq2.zy,sq1.yx,sq1.zy,sq2.color);
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cddowndown(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx>=sq2.zx)and(sq1.zx<=sq2.yx)and(sq1.yy>=sq2.zy)and(sq1.yy<=sq2.yy)and(sq1.yx<=sq2.yx)and(sq1.zy<=sq2.zy) then cz:=true;
if not cz then exit;
{writeln('cdowndown');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq1.zx,sq2.yy,sq2.color);
enque(sq1.zx,sq1.yy,sq1.yx,sq2.yy,sq2.color);
enque(sq1.yx,sq2.zy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdwideup(sq1,sq2:lzy;pos:longint);
var
cZ:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.yx>=sq2.yx)and(sq1.zy>=sq2.zy)and(sq1.zy<=sq2.yy)and(sq1.yy>=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cdwideup');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq2.yx,sq1.zy,sq2.color);
cl:=true;
end;
Procedure cdwidecentre(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.yx>=sq2.yx)and(sq1.zy<=sq2.yy)and(sq1.zy>=sq2.zy)and(sq1.yy<=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cdwidecentre');}
use[pos]:=true;
enque(sq2.zx,sq1.yy,sq2.yx,sq2.yy,sq2.color);
enque(sq2.zx,sq2.zy,sq2.yx,sq1.zy,sq2.color);
cl:=true;
end;
Procedure cdwidedown(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.yx>=sq2.yx)and(sq1.yy<=sq2.yy)and(sq1.yy>=sq2.zy)and(sq1.zy<=sq2.zy) then cz:=true;
if not cz then exit;
{writeln('cdwidedown');}
use[pos]:=true;
enque(sq2.zx,sq1.yy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdwideleft(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx<=sq2.zx)and(sq1.yx>=sq2.zx)and(sq1.yx<=sq2.yx)and(sq1.zy>=sq2.zy)and(sq1.yy<=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cdwideleft');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq2.yx,sq1.zy,sq2.color);
enque(sq1.yx,sq1.zy,sq2.yx,sq1.yy,sq2.color);
enque(sq2.zx,sq1.yy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure cdwideright(sq1,sq2:lzy;pos:longint);
var
cz:boolean;
begin
cz:=false;
if (sq1.zx>=sq2.zx)and(sq1.zx<=sq2.yx)and(sq1.yx>=sq2.yx)and(sq1.zy>=sq2.zy)and(sq1.yy<=sq2.yy) then cz:=true;
if not cz then exit;
{writeln('cdwideright');}
use[pos]:=true;
enque(sq2.zx,sq2.zy,sq2.yx,sq1.zy,sq2.color);
enque(sq2.zx,sq1.zy,sq1.zx,sq1.yy,sq2.color);
enque(sq2.zx,sq1.yy,sq2.yx,sq2.yy,sq2.color);
cl:=true;
end;
Procedure ipt;
begin
init;
readln(a,b,n);
enque(0,0,a,b,1);
for i:=1 to n do
begin
with tmp do
begin
readln(zx,zy,yx,yy,color);
enque(zx,zy,yx,yy,color);
end;
for j:=1 to tail-1 do if not use[j] then
begin
cl:=false;
if not cl then cdspare(tmp,q[j],j);
if not cl then cdinclude(tmp,q[j],j);
if not cl then cdleftcover(tmp,q[j],j);
if not cl then cdrightcover(tmp,q[j],j);
if not cl then cddowncentre(tmp,q[j],j);
if not cl then cdupdown(tmp,q[j],j);
if not cl then cddowndown(tmp,q[j],j);
if not cl then cdwideup(tmp,q[j],j);
if not cl then cdwidecentre(tmp,q[j],j);
if not cl then cdwidedown(tmp,q[j],j);
if not cl then cdwideleft(tmp,q[j],j);
if not cl then cdwideright(tmp,q[j],j);
if not cl then cdzx(tmp,q[j],j);
if not cl then cdys(tmp,q[j],j);
if not cl then cdzs(tmp,q[j],j);
if not cl then cdyx(tmp,q[j],j);
end;
end;
end;
Begin
ipt;
for i:=1 to tail do
begin
if not use[i] and((q[i].yx-q[i].zx)*(q[i].yy-q[i].zy)>=0)then inc(ans[q[i].color],(q[i].yx-q[i].zx)*(q[i].yy-q[i].zy));
end;
for i:=1 to 2500 do if ans[i]>0 then writeln(i,' ',ans[i]);
End.
转载于:https://www.cnblogs.com/FreeDestiny/archive/2011/10/14/2212228.html