題面
已知乙個數列,你需要進行下面兩種操作:
1.將某乙個數加上x
2.求出某區間每乙個數的和
題解1單點修改+區間查詢。
關於樹狀陣列的理解,補上一點。位運算的操作其實對應的就是任意乙個整數在二進位制下都可以被拆分為2^i+2^i-1+…這種形式,所以將1~n的區間也拆成這種好幾個長為2^i的和並加起來。所以樹狀陣列維護的是字首和,區間查詢是用的字首和的性質也。
#include
using
namespace
std;
const
int maxn = 500010;
int n, m, a[maxn];
void add(int x, int v)
}int query(int x)
return ans;
}int main()
for(int i = 1; i <= m; i++)else
}return
0;}
題解2
線段樹當然也是可以做的啦。
#include
#include
using
namespace
std;
const
int maxn = 500010;
int a[maxn];
struct nodesgt[maxn<<2];
void build(int p, int l, int r)else
}void change(int p, int x, int v)
int m = (sgt[p].l+sgt[p].r)/2;
if(x <= m)change(p*2,x,v);
if(x > m)change(p*2+1,x,v);
sgt[p].val = sgt[p*2].val+sgt[p*2+1].val;
}int query(int p, int l, int r)
int main()else
}return
0;}
題解3
啊,是否疲倦了現在的線段樹
太弱,還遞迴!
那我們就歡樂的學習另外一種神奇的線段樹吧!(霧
他叫做zkw線段樹
首先我們來看乙個ppt,《統計的力量》這個是發明人的ppt(啊,ppt內的**是錯的……
統計的力量
#include
const
int maxn = 500050;
int p, sgt[maxn<<2];
void build(int n)
void update(int x, int v)
long
long query(int l, int r)
return ans;
}int main()
return
0;}
luogu3374 樹狀陣列
如題,已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下 操作...
P3374 模板 樹狀陣列 1 洛谷luogu
如題,已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3個整數,表示乙個操作,具體如下 操作1 ...
樹狀陣列模板 洛谷3374
第一類 題目描述 如題,已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 輸入輸出格式 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3個整數,...