樹狀陣列 學習筆記

2022-07-10 04:39:08 字數 1513 閱讀 8387

樹狀陣列

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 也是很多人心中最簡潔優美的資料結構之一。最簡單的樹狀陣列支援兩種操作,時間複雜度均為 當然,樹狀陣列能維護的不侷限於加法,支援的操作也不止這兩種,甚至有大佬能用樹狀陣列實現平衡樹,但這篇筆記不會深入討論 因為我也還不是很懂 回顧一下,我們說,我們...