2648 線段樹練習題五

2021-07-31 21:31:14 字數 1362 閱讀 8384

一行n個方格,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改:提問的形式是求某乙個特定的子區間[a,b]中所有元素的和;修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1≤n≤100000,提問和修改的總數可能達到100000條。

線段樹,定義域c為該區間(點)的值

1.插入數時,點到起點的路徑都加上這個數

2.統計隨便弄一弄

3.因為題目以端點為頂點,所以右兒子的左邊界賦成mid+1

其他一樣

時間複雜度o(m log n)

var

t:array[1..1000000]of longint;

n,m,i,j,k,s:longint;

c:char;

procedure

insert

(p,l,r,a,b:longint);

var m:longint;

begin

t[p]:=t[p]+b;

if l=r then

exit;

m:=(l+r) div

2; if a>=m+1

then insert(p*2+1,m+1,r,a,b) else

if a<=m then insert(p*2,l,m,a,b);

end;

function

count

(p,l,r,a,b:longint):longint;

var m:longint;

begin

if (l=a)and(r=b) then

exit(t[p]);

m:=(l+r) div

2; if b<=m then count:=count(p*2,l,m,a,b) else

if a>=m+1

then count:=count(p*2+1,m+1,r,a,b) else

count:=count(p*2,l,m,a,m)+count(p*2+1,m+1,r,m+1,b);

end;

begin

readln(n);

readln(m);

for i:=1

to m do

begin

readln(c,j,k);

if c='m'

then insert(1,1,n,j,k)

else

begin

if j>k then

begin s:=j;j:=k;k:=s;end;

writeln(count(1,1,n,j,k));

end;

end;

end.

線段樹 SSL 2648 線段樹練習題五

給出幾個剛開始為0的格仔,我們可以進行兩種操作 1 修改 m x y 給格仔x加上y 2 查詢 c x y 格仔x到格仔y上的數的總和 線段樹。用cover表示當前這個區間裡的格仔的總和,每次修改的時候我們查詢到代表它那個範圍的節點,然後遞迴回它的根節累加,查詢就是查到了代表x到y的那個區間就返回c...

SSL 2648 線段樹練習題五 線段樹變式

time limit 10000ms memory limit 65536k case time limit 1000ms 一行n個方格,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特...

SSLGZ 2648 線段樹練習五

問題描述 一行n個方格,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數可能達到100000條。樣例...