洛谷p3374樹狀陣列 1
能夠用樹狀陣列維護的值必須滿足區間加(將兩個區間合併)和區間減(將乙個區間拆開)(例:區間和可以加減,但區間最值只能加不能減)。樹狀陣列的作用是動態維護區間資料和動態查詢,基本用途是維護區間和(以下講解都以區間和為例)。
lowbit運算:lowbit(n)定義為非負整數n在二進位制表示下「最低位的1和其後面所有的0」構成的數值。(例子:n=10=(1010),lowbit(n)=2=(10) )
c++中,在補碼表示下,~n=-1-n, lowbit(n)=n&(~n+1)=n&(-n)。
另c[x]表示序列的區間[x-lowbit(x)+1,x]中的所有數的和,於是區間[1,x]就可以分為(log x)段,相當於二進位制分解的過程。(例:x=7=(111),[1,7]分成[1,4],[5,6],[7,7],區間長度分別為4,2,1)
#include using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int n,m;
int sum[maxn];
inline int lowbit(int x)
inline void add(int x,int y) //給第x個位置加y
inline int ask(int x) //查詢區間[1,x]的和
int main()
for(int i=1;i<=m;i++) }
return 0;
}
模板 樹狀陣列1
這篇是樹狀陣列模板1 主要內容有 1.將某數加上x 2.求某區間和 也就是說支援單點修改 關於樹狀陣列的部落格講解 見基本介紹 include include include using namespace std define in read typedef long long ll const ...
模板 樹狀陣列 1
題目鏈結 如題,已知乙個數列,你需要進行下面兩種操作 第一行包含兩個正整數 n,m,分別表示該數列數字的個數和操作的總個數。第二行包含 n 個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來 m 行每行包含 3 個整數,表示乙個操作,具體如下 輸出包含若干行整數,即為所有操作 ...
模板 樹狀陣列1
這篇是樹狀陣列模板1 主要內容有 1.將某數加上x 2.求某區間和 也就是說支援單點修改 關於樹狀陣列的部落格講解 見基本介紹 include include include using namespace std define in read typedef long long ll const ...