Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
Register

## 运行错误，求救

Posted by yedeming at 2010-03-06 20:17:16 on Problem 2082
```var n,i,j,x,y,z:longint;
tmp,best:int64;
w,h,fa,left,right,num,h1:array[0..50005]of longint;
sum:array[0..50005]of int64;
function find(x:longint):longint;
var r:longint;
begin
find:=x;
while find<>fa[find] do find:=fa[find];
while x<>fa[x] do begin
r:=x;
x:=fa[x];
fa[r]:=find;
end;
end;
procedure sort(x,y:longint);
var i,j,k:longint;
begin
i:=x;j:=y;k:=h1[(x+y)shr 1];
while i<j do begin
while h1[i]>k do inc(i);
while h1[j]<k do dec(j);
if i<=j then begin
h1[0]:=h1[i];h1[i]:=h1[j];h1[j]:=h1[0];
num[0]:=num[i];num[i]:=num[j];num[j]:=num[0];
inc(i);dec(j);
end;
end;
if i<y then sort(i,y);
if j>x then sort(x,j);
end;
procedure he(x,y:longint);
begin
if x=y then exit;
fa[y]:=x;
if left[y]<left[x] then left[x]:=left[y];
if right[y]>right[x] then right[x]:=right[y];
end;
begin
while true do begin
fillchar(left,sizeof(left),0);
fillchar(right,sizeof(right),0);
fillchar(w,sizeof(w),0);
fillchar(h,sizeof(h),0);
fillchar(h1,sizeof(h1),0);
fillchar(sum,sizeof(sum),0);
fillchar(fa,sizeof(fa),0);
if n=-1 then break;
sum[0]:=0;
for i:=1 to n do begin
h1[i]:=h[i];
sum[i]:=sum[i-1]+w[i];
fa[i]:=i;
num[i]:=i;
left[i]:=i;right[i]:=i;
end;
sort(1,n);
best:=0;
for i:=1 to n do begin
z:=find(num[i]);
if (z<>1)and(h[left[z]-1]>=h[num[i]]) then
x:=find(left[z]-1) else x:=0;
if (right[z]<>n)and(h[right[z]+1]>=h[num[i]]) then
y:=find(right[z]+1) else y:=0;
if (y<>0)and(x<>0) then begin
he(z,y);
he(x,z);
tmp:=(sum[right[x]]-sum[left[x]-1])*h1[i];
end else if (x=0)and(y<>0) then begin
he(z,y);
tmp:=(sum[right[z]-sum[left[z]-1]])*h1[i];
end
else if (x<>0)and(y=0) then begin
he(x,z);
tmp:=(sum[right[x]]-sum[left[x]-1])*h1[i];
end
else tmp:=w[num[i]]*h1[i];
if tmp>best then best:=tmp;
end;
writeln(best);
end;
end.

Followed by: