8 0 10 19 4
OUTPUT FORMAT
输出文件应该包含一个所有能被看到颜色连同该颜色的总面积的清单( 即使颜色的区域不是连续的),按color的增序顺序。不要显示没有区域的颜色。
1 91
2 84
3 1874 38
这道题目就是矩形切割法:假设当前上面的布已经全部布好了,现在要布的是最最下面的那张白纸,你可以把这张白纸想象成一个可以分解的果冻,每遇到一张布可以往他的上下左右四个方向去分解,而分解的坐标与你当前碰到的这张布的坐标相关。例如如果你当前要分解到这张布的左边,则你分解完之后x1坐标要赋值为(这张布的左边),方便下次计算。(因为左边你已经计算过了,当然无需再计算,也就是把它覆盖,x1坐标更新罢了),其他方向亦然。分解(走完)n个之后就可以计算面积了,这里不一定每个布都要分解,只要当前大布不包含其即可。
代码:
var
count:array[1..10000]of longint;
a:array[0..1000,1..5]of longint;
n,x,y,i:longint;
procedure dfs(x1,y1,x2,y2,tot:longint);
begin
while ((x1>=a[tot,3]) or (y1>=a[tot,4]) or (x2<=a[tot,1]) or (y2<=a[tot,2])) and (tot<=n) do inc(tot);
if tot>n then
begin
inc(count[a[i,5]],(x2-x1)*(y2-y1));
exit;
end;
if x1<a[tot,1] then //go up
begin
dfs(x1,y1,a[tot,1],y2,tot+1);
x1:=a[tot,1];
end;
if x2>a[tot,3] then //go down
begin
dfs(a[tot,3],y1,x2,y2,tot+1);
x2:=a[tot,3];
end;
if y1<a[tot,2] then //go left
begin
dfs(x1,y1,x2,a[tot,2],tot+1);
y1:=a[tot,2];
end;
if y2>a[tot,4] then //go right
begin
dfs(x1,a[tot,4],x2,y2,tot+1);
y2:=a[tot,4];
end;
end;
begin
readln(x,y,n);
for i:=1 to n do
readln(a[i,1],a[i,2],a[i,3],a[i,4],a[i,5]);
a[0,1]:=0;
a[0,2]:=0;
a[0,3]:=x;
a[0,4]:=y;
a[0,5]:=1;
for i:=0 to n do
dfs(a[i,1],a[i,2],a[i,3],a[i,4],i+1);
for i:=1 to 1000 do
if count[i]>0 then writeln(i,' ',count[i]);
end.