板子 樹狀陣列

2021-08-03 14:31:50 字數 2040 閱讀 8453

已知乙個數列,你需要進行下面兩種操作:

1.將某區間每乙個數數加上x

2.求出某區間數值和

第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含2或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x k 含義:將第x個數加上k

操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和

輸出包含若干行整數,即為所有操作2的結果。

5 5

1 5 4 2 3

1 1 3

2 2 5

1 3 -1

1 4 2

2 1 4

14

16

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=10000,m<=10000

對於100%的資料:n<=500000,m<=500000

題意:單點修改+區間查詢

實現:樹狀陣列

#include

using

namespace

std;

const

int sm = 500000+10;

int n,m,f,sum,c[sm];

char ch;

void read(int &x)

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

x*=f;

}int lowbit(int x)

void add(int x,int b)

int query(int x)

int main()

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的結果。

5 5

1 5 4 2 3

1 2 4 2

2 31 1 5 -1

1 3 5 7

2 4

6

10

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=10000,m<=10000

對於100%的資料:n<=500000,m<=500000

題意:區間修改+單點查詢

實現:理解差分思想。安利這篇部落格的講解:樹狀陣列求和的三種模型

#include

using

namespace

std;

const

int sm = 5e5+10;

int n,m,f,x,y,k,ind,sum,a[sm],b[sm];

char ch;

void read(int &x)

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

x*=f;

}int lowbit(int x)

void modify(int x,int y)

int query(int x)

int main()

else

printf("%d\n",query(x)+a[x]);

}return

0;}

樹狀陣列板子

板子1 板子2在放板子的 之前,先講一下樹狀陣列。樹狀陣列的作用 在有修改時可以做到log級別求字首和 還可以結合差分等神奇的東西食用 空間比線段樹要省的多,量也少的多 在單點查詢的時候比線段樹快了不是一點 我真的沒有拿線段樹的板子去拍這兩個題 我們先來看一下樹狀陣列是個什麼東西 首先,我們有乙個序...

樹狀陣列維護子樹和

題目鏈結 problem 已知有 n 個節點,有 n 1 條邊,形成乙個樹的結構 給定乙個根節點 k,每個節點都有乙個權值,節點i的權值為 vi 給 m 個操作,操作有兩種型別 1 space a space x 表示將節點 a 的權值加上 x 2 space a 表示求 a 節點的子樹上所有節點的...

POJ 3321 DFS序 樹狀陣列 查詢子樹

給乙個樹,查詢結點下的子樹的蘋果總數,並且要求支援增減蘋果 查詢子樹,我們首先想到的是dfs序,還要支援修改操作,我們可以用樹狀陣列維護這個dfs序,因為還要查詢,所以我在實際程式中使用了尤拉序。include include include define debug x cout x define...