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