| ||||||||||
| 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 | |||||||||
求数据wa得不行了。。。。。。。。。
边界、int64、n=0都考虑了。。。。。。。
var n,w,h,i,j,ro,nn,ans:longint;
t:array[0..20001] of record key:int64; le,ri,pri,mm,ms,cnt,num:longint; end;
b:array[1..10001] of longint;
a:array[0..10001] of record x,y:int64; c:longint; end;
function max(const x,y:longint):longint;
begin if x>y then exit(x) else exit(y); end;
procedure q(const l,r:longint);
var ii,jj,tt:longint;
x:int64;
begin
ii:=l; jj:=r;
x:=a[b[(l+r) shr 1]].x;
repeat
while a[b[ii]].x<x do inc(ii);
while x<a[b[jj]].x do dec(jj);
if ii<=jj
then begin
tt:=b[ii]; b[ii]:=b[jj]; b[jj]:=tt;
inc(ii); dec(jj);
end;
until ii>jj;
if l<jj then q(l,jj);
if ii<r then q(ii,r);
end;
procedure updata(const x:longint);
begin
t[x].mm:=t[t[x].le].mm+t[t[x].ri].mm+t[x].cnt;
t[x].ms:=max(t[t[x].le].ms,
max(t[x].mm-t[t[x].ri].mm,t[x].mm-t[t[x].ri].mm+t[t[x].ri].ms));
end;
procedure lt(var x:longint);
var y:longint;
begin
y:=t[x].ri;
t[x].ri:=t[y].le;
t[y].le:=x;
updata(x);
updata(y);
x:=y;
end;
procedure rt(var x:longint);
var y:longint;
begin
y:=t[x].le;
t[x].le:=t[y].ri;
t[y].ri:=x;
updata(x);
updata(y);
x:=y;
end;
procedure insert(var x:longint;const kk:int64; cc:longint);
begin
if x=0
then begin
inc(nn);
with t[nn] do
begin
key:=kk; cnt:=cc; num:=1;
pri:=random(maxlongint);
end;
x:=nn;
end
else begin
if kk<t[x].key
then begin
insert(t[x].le,kk,cc);
if t[t[x].le].pri>t[x].pri then rt(x);
end
else if kk>t[x].key
then begin
insert(t[x].ri,kk,cc);
if t[t[x].ri].pri>t[x].pri then lt(x);
end
else begin
inc(t[x].cnt,cc);
inc(t[x].num);
end;
end;
updata(x);
end;
procedure delete(var x:longint;const kk:int64; cc:longint);
begin
if kk<t[x].key
then delete(t[x].le,kk,cc)
else if kk>t[x].key
then delete(t[x].ri,kk,cc)
else if t[x].num>1
then begin
dec(t[x].num);
dec(t[x].cnt,cc);
end
else begin
if t[x].le+t[x].ri=0
then x:=0
else begin
if t[t[x].le].pri>t[t[x].ri].pri
then rt(x) else lt(x);
delete(x,kk,cc);
end;
end;
updata(x);
end;
begin
repeat
read(n,w,h);
if n=0 then begin writeln(0); continue; end;
for i:=1 to n do
with a[i] do
begin
read(x,y,c);
b[i]:=i;
end;
q(1,n);
i:=0; j:=0; nn:=0;
fillchar(t,sizeof(t),0);
ro:=0; t[0].pri:=-1;
b[n+1]:=0; a[0].x:=maxlongint*2;
repeat
if i>0
then begin
delete(ro,a[b[i]].y,a[b[i]].c);
delete(ro,a[b[i]].y+int64(h),-a[b[i]].c);
end;
inc(i);
while a[b[j+1]].x-a[b[i]].x<w do
begin
inc(j);
insert(ro,a[b[j]].y,a[b[j]].c);
insert(ro,a[b[j]].y+int64(h),-a[b[j]].c);
end;
ans:=max(t[ro].ms,ans);
until (i=j) or (j=n);
writeln(ans);
until seekeof;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator