樹狀陣列 段修改,點查詢

2021-06-26 21:51:21 字數 1073 閱讀 2692

利用差分,先得到乙個差分序列(如:(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.

樹狀陣列 改點求段

改點求段是樹狀陣列中最簡單的,它只改變某個點,然後求某一段。獲得x的管理範圍 int lowbit int x 給x加上k 不停地找上司,不停地改變,直到到了頭 void add int x,int k 求1 x所以元素的值的和 不停地剩下那段的最高上司,不停地累加,直到到了頭 int getsum...

樹狀陣列的區間修改 查詢

首先看樹狀陣列是用來求字首和比較方便的一種資料結構 sum i sigma a i sum bit x 而區間修改也不難實現 就是引入乙個差分陣列del del i 表示對i n的修改 這樣的話也就是最del i 求字首和 就能得到i n的所有修改了 因為i前的每乙個元素的修改都是對後面所有元素的修...

樹狀陣列 區間修改 單點查詢

說一下差分 現在我們有乙個從小到大的數列a a 1 3 6 8 9 然後還有乙個差分陣列b b 1 2 3 2 1 對應 1,3 1,6 3,8 6,9 8,相信某些同學絕已經看出端倪了.這裡b i a i a i 1 我令a 0 0,故b 1 a 1 int now 0,temp scanf d ...