BZOJ 2683 簡單題 CDQ分治

2022-03-29 06:13:26 字數 1174 閱讀 9930

n*n矩陣,支援單點修改,查詢某乙個子矩陣內的和

\(n \leq 500000\),運算元\(\leq 200000\)

首先運用二維字首和的思想,把子矩陣的和拆成四個字首和。

然後把詢問和修改看成(x,y,t)的三元組,t表示當前是第幾次操作。然後就變成三維偏序問題,對於每個詢問,找x,y,t均比它小的修改操作,再求和。

#include#include#include#include#define maxn 2000000

#define maxm 2000000

using namespace std;

int n,m,cnt,qcnt;

typedef int ll;

struct node

node(int _a,int _b,int _c,int _type,int _val)

node(int _a,int _b,int _c,int _type,int _val,int _id)

}q[maxn+5];

int cmpa(node p,node q)

}t;node tmp[maxn+5];

void cdq_divide(int l,int r)

if(q[i].type==2) q[i].ans+=t.query(q[i].c);

} for(int i=l;i<=ptr;i++) if(q[i].type==1) t.update(q[i].c,-q[i].val);

int pl=l,pr=mid+1;

int num=l-1;

while(pl<=mid&&pr<=r)

while(pl<=mid) tmp[++num]=q[pl++];

while(pr<=r) tmp[++num]=q[pr++];

for(int i=l;i<=r;i++) q[i]=tmp[i];

}ll ans[maxn+5];

int main()else if(cmd==2)else

} sort(q+1,q+1+cnt,cmpa);

cdq_divide(1,cnt);

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

} for(int i=1;i<=qcnt;i++) printf("%d\n",ans[i]);

}

bzoj2683簡單題 cdq分治

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

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