blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作:
這個機器就是這麼的神奇,但是 blue 的計算機壞掉了,你能幫他修一下嗎?
input
輸入資料有多組(資料組數不超過 20),到 eof 結束。
對於每組資料:
output
對於每組資料中的每次型別為 2 的操作,輸出 1 行,包含乙個整數,表示計算出的和。
example input
51 2 3 4 5
52 1 2
2 1 5
1 4 10
2 4 5
2 1 5
example output
31519
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個士...