已知乙個數列,你需要進行下面兩種操作:
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...