陣列計算機
time limit: 1000ms memory limit: 65536kb
submit statistic
problem description
blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作:
操作 1:把陣列中第 p 個元素的值增加 v。
操作 2:計算陣列中 [l, r] 區間內所有數的和。
這個機器就是這麼的神奇,但是 blue 的計算機壞掉了,你能幫他修一下嗎?
input
輸入資料有多組(資料組數不超過 20),到 eof 結束。
對於每組資料:
第 1 行輸入乙個整數 n (1 <= n <= 10^5),表示陣列中元素的個數。
第 2 行輸入 n 個用空格隔開的整數 ai (1 <= ai <= 10^10),表示初始輸入到計算機中的陣列。
第 3 行輸入乙個整數 q (1 <= q <= 50000),表示使用者的操作次數。
接下來 q 行,每行輸入先輸入 1 個整數,表示操作型別,根據不同的操作型別:
如果型別為 1,則緊接著輸入 2 個用空格隔開的整數 p (1 <= p <= n) 和 v (1 <= v <= 10^10),表示要把陣列中第 p 個數的值增加 v。
如果型別為 2,則緊接著輸入 2 個用空格隔開的整數 l, r (1 <= l <= r <= n),表示要計算區間 [l, r] 內所有數的和(陣列下標從 1 開始)。
output
對於每組資料中的每次型別為 2 的操作,輸出 1 行,包含乙個整數,表示計算出的和。
example input
5 1 2 3 4 5
5 2 1 2
2 1 5
1 4 10
2 4 5
2 1 5
example output
3 15
19 25
hint
author
「2023年寒假集訓分組測試賽2」blue
think:
樹狀陣列用於更改元素的值以及查詢任意兩個元素之間所有元素的和。
與二分法有著密不可分的關係。
維護和查詢複雜度都分別為o(lgn).
推薦一篇講解樹狀陣列的部落格
#include
#include
#include
#define max 4000000
long
long
int a[max];
int n;
int lowbit(int v)//將v變成二進位制,然後求出最後的零的個數
void updata(int m, long
long
int c)//更新某個位置的值
}long
long
int getsum(int n)//求和
return s;
}int main()
int m;
scanf("%d", &m);
while(m--)
else}}
return
0;}
陣列計算機
陣列計算機 time limit 1000ms memory limit 65536kb submit statistic discuss problem description blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作 操...
SDUT OJ 陣列計算機(線段樹)
time limit 1000 ms memory limit 65536 kib submit statistic problem description blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作 這個機器就是這麼的神奇,...
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...