GSS1 线段数

本文介绍了一个使用线段树实现的简单算法来解决区间最大和的问题,并分享了具体的Pascal代码实现细节。
这个题很简单的= - =传上来是因为我要得到成就  持之以恒!

就是区间最大和= -= 

一个线段数就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.


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值