Luogu P4514(樹狀陣列區間查詢區間修改)

2021-08-24 23:08:08 字數 1813 閱讀 1502

「第一分鐘,x說,要有矩陣,於是便有了乙個裡面寫滿了 00 的 n×mn×m 矩陣。

第二分鐘,l說,要能修改,於是便有了將左上角為 (a,b)(a,b) ,右下角為 (c,d)(c,d) 的乙個矩形區域內的全部數字加上乙個值的操作。

第三分鐘,k說,要能查詢,於是便有了求給定矩形區域內的全部數字和的操作。

第四分鐘,彩虹喵說,要基於二叉樹的資料結構,於是便有了資料範圍。

第五分鐘,和雪說,要有耐心,於是便有了時間限制。

第六分鐘,吃鋼琴男說,要省點事,於是便有了保證運算過程中及最終結果均不超過32位有符號整數型別的表示範圍的限制。

第七分鐘,這道題終於造完了,然而,造題的神牛們再也不想寫這道題的程式了。」

——《上帝造裸題的七分鐘》

所以這個神聖的任務就交給你了。

輸入格式:

輸入資料的第一行為x n m,代表矩陣大小為 n×mn×m 。

從輸入資料的第二行開始到檔案尾的每一行會出現以下兩種操作:

請注意, kk 為小寫。

輸出格式:

針對每個k操作,在單獨的一行輸出答案。

輸入樣例#1:複製

x 4 4

l 1 1 3 3 2

l 2 2 4 4 1

k 2 2 3 3

輸出樣例#1:複製

12
對於10%的資料, 1 ≤ n ≤ 16, 1 ≤ m ≤ 161≤n≤16,1≤m≤16 , 操作不超過200個.

對於60%的資料, 1 ≤ n ≤ 512, 1 ≤ m ≤ 5121≤n≤512,1≤m≤512 .

對於100%的資料, 1 ≤ n ≤ 2048, 1 ≤ m ≤ 2048, -500 ≤ delta ≤ 5001≤n≤2048,1≤m≤2048,−500≤delta≤500 ,操作不超過200000個,保證運算過程中及最終結果均不超過32位帶符號整數型別的表示範圍。

by xlk

思路:二維樹狀陣列區間修改區間查詢。

需要差分。

查詢[1,1]到[x,y]的原式為

所以需要維護4個樹狀陣列。

#include#include#includeusing namespace std;

const int maxn = 2050;

int c1[maxn][maxn],c2[maxn][maxn],c3[maxn][maxn],c4[maxn][maxn];

int n,m;

void update(int c[maxn],int x,int y,int w)

x += x&(-x);

}}int sum(int c[maxn],int x,int y)

x -= x&(-x);

}return ans;

}void add(int x,int y,int w)

int getsum(int x,int y)

int read()

int main()

else}}

LuoguP3374 樹狀陣列1

discription 已知乙個數列,你需要進行下面兩種操作 將某乙個數加上 x 求出某區間每乙個數的和 input 1 x k 含義 將第 x 個數加上 k 2 x y 含義 輸出區間 x,y 內每個數的和 output 所有2操作的結果.solution 引入lowbit運算 例如 44 101...

luogu P3368 模板 樹狀陣列 2

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含2或4個整數,表示乙個操作,具體如下 操...

LuoguP3368 模板 樹狀陣列 2

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的值 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含2或4個整數,表示乙個操作,具體如下 操作1 格式...