樹狀陣列模板題1,2(做個記錄)
阿新 • • 發佈:2018-12-30
題目描述
如題,已知一個數列,你需要進行下面兩種操作:
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
輸出樣例#1: 複製
14 16
說明
時空限制:1000ms,128M
資料規模:
對於30%的資料:N<=8,M<=10
對於70%的資料:N<=10000,M<=10000
對於100%的資料:N<=500000,M<=500000
樣例說明:
故輸出結果14、16
#include<iostream> using namespace std; #define lowbit(i) ((i) & (-i)) const int maxn = 500010; int c[maxn], A[maxn]; int getSum(int x) { int sum = 0; for (int i = x; i > 0; i -= lowbit(i)) { sum += c[i]; } return sum; } void update(int x, int v) { for (int i = x; i < maxn; i += lowbit(i)) { c[i] += v; } } int n, m, a, b, d; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> A[i]; update(i, A[i]); } for (int i = 1; i <= m; i++) { cin >> a >> b >> d; if (a == 1) { update(b, d); } else if (a == 2) { long long result = getSum(d) - getSum(b - 1); cout << result << endl; } } return 0; }
題目描述
如題,已知一個數列,你需要進行下面兩種操作:
1.將某區間每一個數數加上x
2.求出某一個數的值
輸入輸出格式
輸入格式:
第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的總個數。
第二行包含N個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。
接下來M行每行包含2或4個整數,表示一個操作,具體如下:
操作1: 格式:1 x y k 含義:將區間[x,y]內每個數加上k
操作2: 格式:2 x 含義:輸出第x個數的值
輸出格式:
輸出包含若干行整數,即為所有操作2的結果。
輸入輸出樣例
輸入樣例#1: 複製
5 5 1 5 4 2 3 1 2 4 2 2 3 1 1 5 -1 1 3 5 7 2 4
輸出樣例#1: 複製
6 10
說明
時空限制:1000ms,128M
資料規模:
對於30%的資料:N<=8,M<=10
對於70%的資料:N<=10000,M<=10000
對於100%的資料:N<=500000,M<=500000
樣例說明:
故輸出結果為6、10
#include<iostream>
using namespace std;
#define lowbit(i) ((i) & (-i))
const int maxn = 500010;
int c[maxn], A[maxn];
int n, m, a, b, d, e;
int getSum(int x) {
int sum = 0;
for(int i = x; i < maxn; i += lowbit(i)) {
sum += c[i];
}
return sum;
}
void update (int x, int v) {
for (int i = x; i > 0; i -= lowbit(i)) {
c[i] += v;
}
}
int main () {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> A[i];
update(i, A[i]);
update(i - 1, - A[i]);
}
for (int i = 1; i <= m; i++) {
cin >> a;
if (a == 1) {
cin >> b >> d >> e;
update(d, e);
update(b - 1, -e);
} else if (a == 2) {
cin >> b;
long long result = getSum(b);
cout << result << endl;
}
}
return 0;
}