首页 > 代码库 > 【树状数组】段修改,点查询
【树状数组】段修改,点查询
利用差分,先得到一个差分序列(如:(1,2,3,5)的差分序列为(1,1,1,2))
当[i,j]段中所有数均加上数m时,在差分序列的i位置加上m,在j+1位置减去m即可
求和利用树状数组
以下是pascal程序:
var a,fai:array[0..1000] of longint; c:char; n,i,x,y,f,m:longint; function lowbit(x:longint):longint; begin lowbit:=x and (-x); end; procedure modify(k,d:longint); begin while k<=n do begin fai[k]:=fai[k]+d; k:=k+lowbit(k); end; end; function sum(x:longint):longint; begin sum:=0; while x>0 do begin sum:=sum+fai[x]; x:=x-lowbit(x); end; end; begin readln(n); for i:=1 to n do begin read(a[i]); modify(i,a[i]-a[i-1]); end; readln(m); for i:=1 to m do begin read(c); if c='C' then begin readln(x,y,f); modify(x,f); modify(y+1,-f); end; if c='Q' then begin readln(x); writeln(sum(x)); end; end; readln; end.
【树状数组】段修改,点查询
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。