线段树模板复习

来源:互联网 发布:中信建投网上交易软件 编辑:程序博客网 时间:2024/06/11 13:35

bulid

procedure bulid(v,l,r:longint);var mid:longint;begin  mark[v]:=0;  if l=r then tree[v]:=a[l]  else begin         mid:=(l+r) >> 1;         bulid(v+v,l,mid);         bulid(v+v+1,mid+1,r);         tree[v]:=tree[v+v]+tree[v+v+1];       end; end;

单点修改的线段树维护

单点修改

procedure modify(v,l,r,i,val:longint);var mid:longint;begin  if l=r then begin tree[v]:=tree[v]+val; exit; end;  mid:=(l+r) >> 1;  if i<=mid then modify(v+v,l,mid,i,val)  else modify(v+v+1,mid+1,r,i,val);  tree[v]:=tree[v+v]+tree[v+v+1];end;

查找

function search(v,l,r,x,y:longint):longint;var mid:longint;begin  if (l=x) and (r=y) then exit(tree[v]);  mid:=(l+r) >> 1;  if y<=mid then exit(search(v+v,l,mid,x,y))  else if x>=mid+1 then exit(search(v+v+1,mid+1,r,x,y))  else exit(search(v+v,l,mid,x,mid)+search(v+v+1,mid+1,r,mid+1,y));  end;

区间修改线段树维护

区间修改

procedure modify(v,l,r,x,y,val:longint);var mid:longint;begin  //writeln(v,' ',l,' ',r,' ',x,' ',y,' ',val);  if (l=x) and (r=y) then   begin     mark[v]:=mark[v]+val;    exit;  end;  mid:=(l+r) >> 1;  mark[v+v]:=mark[v+v]+mark[v];  mark[v+v+1]:=mark[v+v+1]+mark[v];  mark[v]:=0;  if y<=mid then modify(v+v,l,mid,x,y,val)  else if x>=mid+1 then modify(v+v+1,mid+1,r,x,y,val)  else begin modify(v+v,l,mid,x,mid,val); modify(v+v+1,mid+1,r,mid+1,y,val); end;  tree[v]:=tree[v+v]+tree[v+v+1]+mark[v+v]*(mid-l+1)+mark[v+v+1]*(r-mid);end;

查找

function search(v,l,r,x,y:longint):int64;var mid:longint;begin  if (l=x) and (r=y) then exit(tree[v]+(r-l+1)*mark[v]);  mid:=(l+r) >> 1;  if y<=mid then exit(search(v+v,l,mid,x,y)+(y-x+1)*mark[v])  else if x>=mid+1 then exit(search(v+v+1,mid+1,r,x,y)+(y-x+1)*mark[v])  else exit(search(v+v,l,mid,x,mid)+search(v+v+1,mid+1,r,mid+1,y)+(y-x+1)*mark[v]);  end;