首页 > 编程语言 > 详细

线段树与树状数组模板

时间:2015-07-14 17:34:04      阅读:173      评论:0      收藏:0      [点我收藏+]

线段树模板(以求和为例)

构造

技术分享
procedure make(p,l,r:longint);
var mid:longint;
begin
  a[p,1]:=l; a[p,2]:=r; a[p,3]:=0; if l=r then a[p,3]:=w[l];
  if l<r then
   begin
     mid:=(l+r) div 2;
     make(p*2,l,mid); make(p*2+1,mid+1,r);
     a[p,3]:=a[p*2,3]+a[p*2+1,3];
   end;
end;
make

修改(元素)

技术分享
procedure change1(p,x,num:longint);
var mid:longint;
begin
  if a[p,1]=a[p,2] then inc(a[p,3],num)
  else
    begin
      mid:=(a[p,1]+a[p,2]) div 2;
      if x<=mid then change1(p*2,x,num) else if x>mid then change1(p*2+1,x,num);
      a[p,3]:=a[p*2,3]+a[p*2+1,3];
    end;
end;
change1

查询(区间)

技术分享
function  query2(p,l,r:longint):longint;
var mid,ans:longint;
begin
  if (l<=a[p,1])and(a[p,2]<=r) then exit(a[p,3])
 else
  begin
    mid:=(a[p,1]+a[p,2]) div 2; ans:=0;
    if l<=mid then inc(ans,query2(p*2,l,r));
    if r>mid then inc(ans,query2(p*2+1,l,r));
    exit(ans);
  end;
end;
query2

 

线段树与树状数组模板

原文:http://www.cnblogs.com/qtyytq/p/4645758.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!