題面:
維護乙個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...