陣列計算機 單點更新和區間查詢

2021-08-07 22:48:23 字數 1686 閱讀 9677

blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作:

這個機器就是這麼的神奇,但是 blue 的計算機壞掉了,你能幫他修一下嗎?

input

輸入資料有多組(資料組數不超過 20),到 eof 結束。

對於每組資料:

output

對於每組資料中的每次型別為 2 的操作,輸出 1 行,包含乙個整數,表示計算出的和。

example input

5

1 2 3 4 5

52 1 2

2 1 5

1 4 10

2 4 5

2 1 5

example output

3

1519

25

這個應該是最最基本的線段樹了吧,模板題,畢竟剛剛接觸嘛~ 單點更新和區間查詢

#include #include #include #include using namespace std;  

const int n = 1e5;

struct tree

segtree[n << 2];

long long v, ans;

int p, x, y;

void build(int l, int r, int k)

int mid = (l + r) >> 1;

build(l, mid, k << 1);

build(mid + 1, r, k << 1 | 1);

segtree[k].w = segtree[k << 1].w + segtree[k << 1 | 1].w;

}void update(int k)

int mid = (segtree[k].l + segtree[k].r) >> 1;

if(p <= mid)

update(k << 1);

else

update(k << 1 | 1);

segtree[k].w = segtree[k << 1].w + segtree[k << 1 | 1].w;

}void sum(int k)

int mid = (segtree[k].l + segtree[k].r) >> 1;

if(x <= mid)

sum(k << 1);

if(y > mid)

sum(k << 1 | 1);

}int main()

else}}

return 0;

}

當然,這道題用樹狀陣列也能做,而且比較簡單

#include #include #include #define lowbit(x) (x & (-x))

const int n = 1e5 + 5;

long long c[n];

int n;

void update(int p, long long v)

long long getsum(int k)

int main()

scanf("%d", &q);

while(q--)

else}}

return 0;

}

樹狀陣列區間更新 單點查詢

設a陣列表示原來的區間 c i a i a i 1 這樣可以看出 a i sum c 1 c 2 c i 例如 a 1 3 4 2 6 8 c 1 2 1 2 4 2 樹狀陣列維護的是c陣列 當把a 3,5 每個數都加2時,我們看c陣列,由於c陣列維護的是相鄰區間的差值,所以c 3 2 因為區間 3...

樹狀陣列區間更新 區間查詢 單點查詢

為了更好地使用複雜度比線段樹更加優化的樹狀陣列,所以必須實現樹狀陣列的區間更新 樹狀陣列時間複雜度為o mlogn 實際用的時候優於線段樹,且寫得少。引入差分陣列,假設初始資料陣列為a,另a 0 0 設要維護的差分陣列為 d i a i a i 1 進一步可知 a i d 1 d 2 d i 即前i...

樹狀陣列 單點更新 區間查詢

input 每組測試用例首先一行是2個正整數n和m n 100000,m 10000 其中,n表示士兵的數量,m表示有m個詢問。接下來一行是n個正整數,依次表示n位士兵cf的rating。其中,rating的取值範圍是小於等於5000。最後是m行的詢問,每行包含2個正整數a和b,表示要計算從第a個士...