bzoj 1176 cdq分治套樹狀陣列

2022-06-28 04:33:12 字數 1338 閱讀 7608

題面:

維護乙個w*w的矩陣,初始值均為s.每次操作可以增加某格仔的權值,或詢問某子矩陣的總權值.修改運算元m<=160000,詢問數q<=10000,w<=2000000.

input

第一行兩個整數,s,w;其中s為矩陣初始值;w為矩陣大小

接下來每行為一下三種輸入之一(不包含引號):

"1 x y a"

"2 x1 y1 x2 y2"

"3"輸入1:你需要把(x,y)(第x行第y列)的格仔權值增加a

輸入2:你需要求出以左下角為(x1,y1),右上角為(x2,y2)的矩陣內所有格仔的權值和,並輸出

輸入3:表示輸入結束

output

對於每個輸入2,輸出一行,即輸入2的答案

思路:正常思路用樹狀陣列套樹狀陣列,但是w範圍過大,開不下。考慮用cdq分治套樹狀陣列。我們用cdq分治對x座標排序,用樹狀陣列維護y座標,把詢問用差分思想拆分成四個不同的詢問即可。

**:

#include #define ll long long

#define lowbit (x & (-x))

using namespace std;

const int maxn = 200010;

int tot, tot_ans, n;

struct query;

query q[maxn], tmp[maxn];

int c[maxn * 10], ans[maxn];

void add(int x, int y)

int ask(int x)

return ans;

}void clear(int x)

}void cdq(int l, int r)

tmp[pos++] = q[l1++];

} else

tmp[pos++] = q[l2++];

} }while(l1 <= mid) tmp[pos++] = q[l1++];

while(l2 <= r)

tmp[pos++] = q[l2++];

} for (int i = l; i <= mid; i++)

} for (int i = l; i <= r; i++)

q[i] = tmp[i];

}int main() ;

} else ;

q[++tot] = (query);

q[++tot] = (query);

q[++tot] = (query);

} }cdq(1, tot);

for (int i = 1; i <= tot_ans; i++)

}

POJ1195 BZOJ1176 題解,CDQ分治

poj1195 mobile bzoj 1176 這兩個題題意完全相同,放在一起說吧 題意 你有乙個n n的棋盤,每個格仔內有乙個整數,初始時的時候全部為0,現在需要維護兩種操作 命令引數限制 內容1 x y a 1 x,y n,a是正整數 將格仔x,y裡的數字加上a 2 x1 y1 x2 y2 1...

bzoj4170 極光(CDQ分治)

time limit 30 sec memory limit 512 mb 若是萬一琪露諾 俗稱rhl 進行攻擊,什麼都好,冷靜地回答她的問題來吸引她。對方表現出興趣的話,那就慢 慢地反問。在她考慮答案的時候,趁機逃吧。就算是很簡單的問題,她一定也答不上來。上古之魔書 天空中出現了許多的北極光,這些...

BZOJ1173 CDQ分治 筆記

目錄一類特殊的cdq分治 附 bzoj mokia ac 偏序關係 link1 資料結構 link1,高階指南p212 雜燴 link1 hdu1892 一維樹狀陣列 二進位制分段思想 可以把 m 2 a 2 b cdots a b cdots 分解成 0,2 a 2 a 2 a 2 b m 2 z...