time limit: 50 sec memory limit: 128 mb
submit: 1803 solved: 731
[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。
cdq分治三維偏序 三維分別是操作序號,橫座標,縱座標
把乙個詢問拆成4個,就變成了處理二維字首和問題
對橫座標排序,操作序號cdq分治,縱座標用bit處理
1 #include2#define n 200005
3using
namespace
std;
4int n,m,t,c[n*3
],ans[n];
5struct
query
11 }q[n<<2],a[n<<2
];12
13void add(int x,int y,int
v)18
void update(int p,int
x)23}24
int ask(int
x)30
return
ret;31}
3233
void solve(int l,int
r)40
for(int i=l;i<=r;++i)
41if(q[i].op==1&&q[i].id<=mid)update(q[i].y,-q[i].v);
42for(int i=l;i<=r;++i)
46for(int i=l;i<=r;++i)q[i]=a[i];
47 solve(l,mid);solve(mid+1
,r);48}
49int
main()
59if(op==2)64
if(op==3)break;65
} 66 sort(q+1,q+1+m);
67 solve(1
,m);
68for(int i=1;i<=t;i++)
69 printf("
%d\n
",ans[i]);
70return0;
71 }
BZOJ 2683 簡單題 CDQ分治
n n矩陣,支援單點修改,查詢某乙個子矩陣內的和 n leq 500000 運算元 leq 200000 首先運用二維字首和的思想,把子矩陣的和拆成四個字首和。然後把詢問和修改看成 x,y,t 的三元組,t表示當前是第幾次操作。然後就變成三維偏序問題,對於每個詢問,找x,y,t均比它小的修改操作,再...
BZOJ 2683 簡單題(CDQ分治 容斥)
description 你有乙個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這個矩形內的數字和 3...
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...