问题 K: 【USACO2012Feb】植草 {Bronze题2}

时间:2023-03-09 01:43:01
问题 K: 【USACO2012Feb】植草 {Bronze题2}

按着矩形周长的思路,到当前边的时候,前一层的覆盖数乘以高度加入 ans 就行,然而真正的算法可能并不是这个。。只能想到这个了

 const maxe=;
type
node=record
l,r,mid,sum,delta:longint;
end;
arr=array[..] of longint;
var i,j,n,bs,x1,y1,x2,y2,b1,b2,l,r,ans,_sum,v:longint;
bx:array[..maxe] of arr;
tree:array[..*maxe] of node;
procedure qsx(t,w:longint);
var mid1,mid2,l,r:longint;
tem:arr;
begin
l:=t; r:=w; mid1:=bx[(l+r) shr ,]; mid2:=bx[(l+r) shr ,];
//writeln(l,' ',r);
repeat
begin
while (bx[l,]<mid1) or ((bx[l,]=mid1) and (bx[l,]>mid2)) do inc(l);
while (bx[r,]>mid1) or ((bx[r,]=mid1) and (bx[r,]<mid2)) do dec(r);
if l<=r then
begin
tem:=bx[l];
bx[l]:=bx[r];
bx[r]:=tem;
inc(l); dec(r);
end;
end;
until l>r;
if t<r then qsx(t,r);
if l<w then qsx(l,w);
end;
procedure build(o,l,r:longint);
begin
tree[o].l:=l; tree[o].r:=r; tree[o].mid:=(l+r) shr ;
tree[o].delta:=; tree[o].sum:=;
if l<>r then
begin
build(o*,l,tree[o].mid);
build(o*+,tree[o].mid+,r);
end;
end;
procedure maintain(o:longint);
begin
tree[o].sum:=;
if tree[o].l<tree[o].r then tree[o].sum:=tree[*o].sum+tree[*o+].sum;
if tree[o].delta> then tree[o].sum:=tree[o].r-tree[o].l+;
end;
procedure update(o:longint);
begin
if (l<=tree[o].l) and (tree[o].r<=r) then inc(tree[o].delta,v)
else begin
if l<=tree[o].mid then update(*o);
if r>tree[o].mid then update(*o+);
end;
maintain(o);
end;
begin
readln(n); bs:=*n;
for i:= to n do
begin
readln(x1,y2,x2,y1);
inc(x1,); inc(x2,);
inc(y1,); inc(y2,);
b1:=*i-; b2:=*i; //writeln(y1,' ',y2);
bx[b1,]:=; bx[b1,]:=x1; bx[b1,]:=x2; bx[b1,]:=y1;
bx[b2,]:=-;bx[b2,]:=x1; bx[b2,]:=x2; bx[b2,]:=y2;
end;
qsx(,bs); ans:=;
build(,,);
for i:= to bs do
begin
l:=bx[i,]; r:=bx[i,]-; v:=bx[i,];
update();
inc(ans,_sum*(bx[i,]-bx[i-,]));
_sum:=tree[].sum;
end;
writeln(ans);
end.

(转载请注明出处:http://www.cnblogs.com/Kalenda/)