这个题很简单的= - =传上来是因为我要得到成就 持之以恒!
就是区间最大和= -=
一个线段数就OK
不知道为什么@chenjingrong一直WA
啦啦啦啦 去写GSS6然后去开BZOJ1500这个大坑了!
大坑!
Orz 下午实战了!
only bless me !
啦啦啦= - =
code:
var
ls,rs,mx,s,f,l,r:array[0..200000] of longint;
n,m,i,a,b,c,d,x,y:longint;
function max(a,b:longint):longint;
begin
if a<b then exit(b) else exit(a);
end;
procedure build(k,u,v:longint);
var
mid:longint;
begin
l[k]:=u;r[k]:=v;
if u=v then
begin
ls[k]:=f[u];
rs[k]:=f[u];
mx[k]:=f[u];
s[k]:=f[u];
exit;
end;
mid:=(u+v) div 2;
build(k*2,u,mid);
build(k*2+1,mid+1,v);
ls[k]:=max(ls[k*2],s[k*2]+ls[k*2+1]);
rs[k]:=max(rs[k*2+1],s[k*2+1]+rs[k*2]);
mx[k]:=max(max(rs[k*2]+ls[k*2+1],mx[k*2]),mx[k*2+1]);
s[k]:=s[k*2]+s[k*2+1];
end;
procedure find(k,u,v:longint;var a,b,c,d:longint);
var
la,lb,lc,ld,ra,rb,rc,rd,mid:longint;
begin
if (u<=l[k]) and (v>=r[k]) then
begin
a:=ls[k];
b:=mx[k];
c:=rs[k];
d:=s[k];
exit;
end;
mid:=(l[k]+r[k]) div 2;
la:=-150008;lb:=-150008;lc:=-150008;ld:=-150008;
ra:=-150008;rb:=-150008;rc:=-150008;rd:=-150008;
if (u<=mid) then find(k*2,u,v,la,lb,lc,ld);
if (v>mid) then find(k*2+1,u,v,ra,rb,rc,rd);
b:=max(lb,max(rb,lc+ra));a:=max(la,ld+ra);c:=max(rc,rd+lc);
d:=ld+rd;
end;
begin
read(n);
for i:=1 to n do
read(f[i]);
build(1,1,n);
read(m);
for i:=1 to m do
begin
read(x,y);
a:=-150008;b:=-150008;c:=-150008;d:=-150008;
find(1,x,y,a,b,c,d);
writeln(b);
end;
end.
本文介绍了一个使用线段树实现的简单算法来解决区间最大和的问题,并分享了具体的Pascal代码实现细节。
1211

被折叠的 条评论
为什么被折叠?



