樹狀陣列 模板2 區間修改 單點查值

2021-09-12 20:06:15 字數 973 閱讀 3832

樹狀陣列的區間修改是基於差分的基礎之上:

設陣列a=,那麼差分陣列b=

也就是說b[i]=a[i]-a[i-1];(a[0]=0;),那麼a[i]=b[1]+....+b[i];

假如區間[2,4]都加上2的話

a陣列變為a=,b陣列變為b=;

發現了沒有,b陣列只有b[2]和b[5]變了,因為區間[2,4]是同時加上2的,所以在區間內b[i]-b[i-1]是不變的.

所以對區間[x,y]進行修改,只用修改b[x]與b[y+1]:

b[x]=b[x]+k;b[y+1]=b[y+1]-k;

用樹狀陣列維護差分陣列b,ps(如果想既區間修改,再區間求和的話就線段樹吧)

樣例輸入:

第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含2或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x y k 含義:將區間[x,y]內每個數加上k

操作2: 格式:2 x 含義:輸出第x個數的值

樣例輸出:

輸出包含若干行整數,即為所有操作2的結果。

測試樣例:

輸入:5 5

1 5 4 2 3

1 2 4 2

2 31 1 5 -1

1 3 5 7

2 4輸出:610

#includeusing namespace std;

int b[500010];

int n,m;

int lowbit(int x)

void updata(int pos,int k)

}int query(int x)

int main()

while(m--)else

} return 0;

}

練習 2 樹狀陣列 模板二(區間修改,單點查詢)

直接放題目然後再進行解釋 樹狀陣列 1.單點修改,區間查詢 2.區間修改,單點查詢 3.區間修改,區間查詢 description 給定數列a 1 a 2 a n 你需要依次進行 q 個操作,操作有兩類 1 l r x 給定 l,r,x,對於所有i l,r 將 a i 加上 x 換言之,將 a l ...

樹狀陣列(單點 區間)操作模板

相關講解鏈結 一維 include include include using namespace std long long n,q,c 1000005 a 1000005 long long lowbit long long x void add long long x,long long d ...

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

說一下差分 現在我們有乙個從小到大的數列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 ...