樹狀陣列的區間修改是基於差分的基礎之上:
設陣列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 ...