「第一分鐘,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 格式...