樹狀陣列
p3374 【模板】樹狀陣列 1
**:題目描述
如題,已知乙個數列,你需要進行下面兩種操作:
• 將某乙個數加上 xx
• 求出某區間每乙個數的和
輸入格式
第一行包含兩個正整數 n,mn,m,分別表示該數列數字的個數和操作的總個數。
第二行包含 nn 個用空格分隔的整數,其中第 ii 個數字表示數列第 ii 項的初始值。
接下來 mm 行每行包含 33 個整數,表示乙個操作,具體如下:
• 1 x k 含義:將第 xx 個數加上 kk
• 2 x y 含義:輸出區間 [x,y][x,y] 內每個數的和
輸出格式
輸出包含若干行整數,即為所有操作的結果。
輸入輸出樣例
輸入 複製
5 51 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
輸出 複製
1416
說明/提示
【資料範圍】
對於 30%30% 的資料,1 \le n \le 81≤n≤8,1\le m \le 101≤m≤10;
對於 70%70% 的資料,1\le n,m \le 10^41≤n,m≤104;
對於 100%100% 的資料,1\le n,m \le 5\times 10^51≤n,m≤5×105。
樣例說明:
故輸出結果14、16
一道樹狀陣列的經典原題。
其實,也可以用暴力,但是,如果tle別怪我~~~~~~
首先,開乙個陣列,維護陣列a的值,具體如圖:
這樣,每乙個數的父親就相當於他的二進位制的最低位 +他自己;
反過來,乙個根節點的兒子就是他減去他的二進位制的最低位;
然而,利用負數的補碼,可以完成這個常數超級小的方法:
cpp int lowbit(int x)
稍微理解一下,就ok了。
**君獻上**:(ac**)
#include//luogu p3374
#define maxn 500001
using namespace std;
int a[maxn],c[maxn];
int x,y,n,t,k;
int lowbit(int x)//核心
int find(int x)
return s;
}void update(int x,int v)
}int main()
while(t--)
else
}}```
學習筆記 樹狀陣列
以下 為樹狀陣列最常用的幾個操作 1.low bi t mathrm lowbit function lowbit x longint int64 begin exit x and x end 2.單點修改 procedure replace x,y int64 var i int64 begin ...
樹狀陣列學習筆記
在學習完了線段樹後,聽說樹狀陣列能寫的題,線段樹都能做,所以一直沒有詳細的學習樹狀陣列 直到碰到了一道卡線段樹的題目,因為線段樹運用了很多遞迴,所以常數比較大,容易被卡 現在總結一下樹狀陣列 1 樹狀陣列個人認為就是字首和演變而來的 2 單點更新 當你要更新某個點的值時,你要從下面到上面依次更新過去...
樹狀陣列學習筆記
樹狀陣列 binary index tree,bit 也是很多人心中最簡潔優美的資料結構之一。最簡單的樹狀陣列支援兩種操作,時間複雜度均為 當然,樹狀陣列能維護的不侷限於加法,支援的操作也不止這兩種,甚至有大佬能用樹狀陣列實現平衡樹,但這篇筆記不會深入討論 因為我也還不是很懂 回顧一下,我們說,我們...