bzoj2683簡單題 cdq分治

2022-05-07 10:00:09 字數 1555 閱讀 2574

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...