time limit: 50 sec memory limit: 128 mb
[submit][status][discuss]你有乙個n*n的棋盤,每個格仔內有乙個整數,初始時的時候全部為0,現在需要維護兩種操作:
命令引數限制
內容
1 x y a
1<=x,y<=n,a是正整數
將格仔x,y裡的數字加上a
2 x1 y1 x2 y2
1<=x1
<= x2
<=n
1<=y1
<= y2
<=n
輸出x1 y1 x2 y2這個矩形內的數字和
無終止程式
輸入檔案第一行乙個正整數n。
接下來每行乙個操作。
對於每個2操作,輸出乙個對應的答案。
41 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 433
51<=n<=500000,運算元不超過200000個,記憶體限制20m。
對於100%的資料,操作1中的a不超過2000。
首先把詢問拆成4個,那麼我們就只要維護乙個點左下角權值和了。
然後對所有操作按照x 公升序排序。
對 y 用個樹狀陣列求字首和,(由於 x 公升序,所以此時詢問已經相當於對y求字首和了)
以mid為分界線,考慮左區間對右區間的影響。
顯然,我們可以把左區間的修改執行,然後執行右區間的詢問。
這樣我們就做完了這道題。
1 #include2 #includeview code3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9 typedef long
long
s64;
1011
const
int one = 1000005;12
const
int inf = 214748340;13
14int
get()
1524
25int
n;26
namespace
bit27
30void add(int r, int
x)31
35int query(int
r)3642}
4344
intid, query_num, ans[one];
45struct
power
46oper[one], q[one];
5051
bool cmp(const power &a, const power &b)
5256
57void deal(int x_1, int y_1, int x_2, int
y_2)58;
61 oper[++id] = (power);
62 oper[++id] = (power);
63 oper[++id] = (power);64}
6566
void solve(int l, int
r)67
7879
for(int i = l; i <= r; i++)
80if(oper[i].opt == 1 && oper[i].id <=mid)
81 bit::add(oper[i].y, -oper[i].val);
8283
int tl = l, tr = mid + 1;84
for(int i = l; i <= r; i++)
85if(oper[i].id <= mid) q[tl++] =oper[i];
86else q[tr++] =oper[i];
8788
for(int i = l; i <= r; i++)
89 oper[i] =q[i];
9091 solve(l, mid), solve(mid + 1
, r);92}
9394
intopt, x_1, y_1, x_2, y_2;
9596
intmain()
97111
112 sort(oper + 1, oper + id + 1
, cmp);
113114 solve(1
, id);
115116
for(int i = 1; i <= query_num; i++)
117 printf("
%d\n
", ans[i]);
118 }
bzoj 2683 簡單題 cdq分治 樹狀陣列
要求資瓷下列操作 1 x y z把 x,y 加上z 2 x1 y1 x2 y2求矩形x1 y1 x2 y2的權值和 n 500000,x,y n,q 200000 首先可以把乙個詢問用容斥原理拆成四個詢問,然後在cdq分治中二分乙個橫座標mid,然後把操作從前往後掃一遍,若是修改操作且橫座標不大於m...
bzoj2683 簡單題 CDQ分治 樹狀陣列
ac通道 題解 話說這題好像可以用整體二分來做 蒟蒻不會啊 cdcq大神的整體二分比我的cdq分治高到不知道 去了。說一下做法吧 首先把詢問的矩形分成4部分,算一下每部分的答案,然後容斥原理即可。怎樣算每部分的答案呢?我們按照時間分治,cdq遞迴過程中按x排序,遇到修改則插入到樹狀陣列中,遇到詢問就...
BZOJ 2683 簡單題 CDQ分治
n n矩陣,支援單點修改,查詢某乙個子矩陣內的和 n leq 500000 運算元 leq 200000 首先運用二維字首和的思想,把子矩陣的和拆成四個字首和。然後把詢問和修改看成 x,y,t 的三元組,t表示當前是第幾次操作。然後就變成三維偏序問題,對於每個詢問,找x,y,t均比它小的修改操作,再...