洛谷P3374 【模板】樹狀數組 1
阿新 • • 發佈:2019-01-30
stream col alt using badge 圖片 nbsp http 進行
輸出樣例#1: 復制
題目描述
如題,已知一個數列,你需要進行下面兩種操作:
1.將某一個數加上x
2.求出某區間每一個數的和
輸入輸出格式
輸入格式:
第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的總個數。
第二行包含N個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。
接下來M行每行包含3個整數,表示一個操作,具體如下:
操作1: 格式:1 x k 含義:將第x個數加上k
操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和
輸出格式:
輸出包含若幹行整數,即為所有操作2的結果。
輸入輸出樣例
輸入樣例#1: 復制5 5 1 5 4 2 3 1 1 3 2 2 5 1 3 -1 1 4 2 2 1 4
14 16
說明
時空限制:1000ms,128M
數據規模:
對於30%的數據:N<=8,M<=10
對於70%的數據:N<=10000,M<=10000
對於100%的數據:N<=500000,M<=500000
樣例說明:
故輸出結果14、16
一道簡單的模板題,沒有什麽特別解題思路。
AC代碼:
#include<iostream> using namespace std; int tree[500004]; int n,m; int lowbit(int k) { return k & (-k); } void mk(int s,intd){ while(s <= n){ tree[s] += d; s += lowbit(s); } } int jia(int k){ int ans = 0; while(k != 0){ ans += tree[k]; k -= lowbit(k); } return ans; } int main(){ cin >> n >> m; for(int i = 1;i <= n; i++) { int a; cin>>a; mk(i,a); } for(int i = 1;i <= m; i++) { int u,x,y; cin >> u; if(u == 1) { cin >> x >> y; mk(x,y); } if(u == 2){ cin >> x >> y; cout << jia(y) - jia(x-1) << endl; } } return 0; }
洛谷P3374 【模板】樹狀數組 1