| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:ac的注意一下啊,下面两组数据不一定过~~~汗In Reply To:ac的注意一下啊,下面两组数据不一定过~~~汗 Posted by:ACM_Qun at 2011-04-09 18:03:48 > 3
> 0 0 1 2
> 0 2 1 4
> 1 1 2 3
> 12
> 3
> 0 1 2 2
> 2 1 4 2
> 1 0 3 1
> 12
这两组都过了,可是WA~能不能指点下- -
const mm=1000000;
type
cc=record
l,r,k,p:longint;
end;
type
arr=array[0..50009]of cc;
type
c1=record
l,r,m,ld,rd,c,line:Longint;
end;
var
tr:array[0..151234]of c1;
x,y,b:arr;
i,j,k,m,n,x1,x2,y1,y2,ans,minx,miny,maxx,maxy,l,r,tt,lx,ly:Longint;
procedure init;
begin
read(n);
minx:=mm;
miny:=mm;
maxx:=-mm;
maxy:=-mm;
for i:=1 to n do
begin
read(x1,y1,x2,y2);
if x1<minx then minx:=x1;
if x2>maxx then maxx:=x2;
if y1<miny then miny:=y1;
if y2>maxy then maxy:=y2;
inc(lx);
with x[lx] do begin l:=y1;r:=y2;k:=x1;end;
inc(lx);
with x[lx] do begin l:=y1;r:=y2;k:=x2;p:=1;end;
inc(ly);
with y[ly] do begin l:=x1;r:=x2;k:=y1;end;
inc(ly);
with y[ly] do begin l:=x1;r:=x2;k:=y2;p:=1;end;
end;
end;
procedure qsort(var a:arr;l,r:longint);
var
i,j,m:Longint;
p:cc;
begin
i:=l;j:=r;m:=a[(l+r)shr 1].k;
repeat
while a[i].k<m do inc(i);
while a[j].k>m do dec(j);
if i<=j then
begin
p:=a[i];
a[i]:=a[j];
a[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if i<r then qsort(a,i,r);
if j>l then qsort(a,l,j);
end;
procedure new(root:Longint);
begin
tr[root].ld:=tr[root*2].ld;
tr[root].rd:=tr[root*2+1].rd;
tr[root].line:=tr[root*2].line+tr[root*2+1].line-tr[root*2].rd*tr[root*2+1].ld;
end;
procedure ins(root,a,b:Longint);
begin
with tr[root] do
if (l>=a)and(r<=b)then
begin
inc(c);
ld:=1;
rd:=1;
line:=1;
end
else
begin
if a<m then ins(root*2,a,b);
if b>m then ins(root*2+1,a,b);
if c=0 then new(root);
end;
end;
procedure del(root,a,b:longint);
begin
with tr[root] do
if (l>=a)and(r<=b) then
begin
dec(c);
if c=0 then new(root);
end
else
begin
if a<m then del(root*2,a,b);
if b>m then del(root*2+1,a,b);
if c=0 then new(root);
end;
end;
procedure build(tt,l,r:Longint);
begin
tr[tt].m:=(l+r)div 2;
tr[tt].l:=l;
tr[tt].r:=r;
if r-l=1 then exit;
build(tt*2,l,tr[tt].m);
build(tt*2+1,tr[tt].m,r);
end;
procedure calc(var a:arr);
begin
for i:=1 to 2*n-1 do
begin
if a[i].p=0 then ins(1,a[i].l,a[i].r)else del(1,a[i].l,a[i].r);
ans:=tr[1].line*(a[i+1].k-a[i].k)+ans;
end;
end;
begin
init;
qsort(x,1,n shl 1);
ans:=0;
fillchar(tr,sizeof(tr),0);
build(1,miny,maxy);
calc(x);
fillchar(tr,sizeof(tr),0);
qsort(y,1,n shl 1);
build(1,minx,maxx);
calc(y);
writeln(ans*2);
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator