码迷,mamicode.com
首页 > 编程语言 > 详细

线段树与树状数组模板

时间:2015-07-14 17:34:15      阅读:113      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!