BZOJ 1176 Mokia(CDQ分治 容斥)

2021-07-11 01:00:35 字數 2230 閱讀 2313

description

維護乙個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的答案

sample input

0 4

1 2 3 3

2 1 1 3 3

1 2 2 2

2 2 2 3 4

3sample output

3 5

solution

令初始值為0(不為0則在每次查詢結果上加上s*(x2-x1+1)*(y2-y1+1)即可)

以sum(x,y)表示棋盤上所有在點(x,y)左上方的元素之和,那麼對於每一次查詢操作x1,y1,x2,y2,答案即為sum(x2,y2)+sum(x1-1,y1-1)+sum(x1-1,y2)-sum(x2,y1-1),將每次查詢操作看作在棋盤上(x1-1,y2),(x2,y1-1),(x1-1,y1-1),(x2,y2)四個點插入值為0的點,那麼問題轉化為對於每個插入操作,如何求在此操作之前插入的點中處於該點左上方的點權之和,這個三維偏序關係的統計可以通過cdq分治來實現,按插入順序分治,ans[i]表示插入的第i個元素的查詢結果,對[l,mid]和[mid+1,r]中的元素都以x為第一關鍵字公升序排,以y為第二關鍵字公升序排,對於[mid+1,r]中的每個i,將區間[l,mid]中所有滿足j.y<=i.y的j以j.x為下標,j.num為鍵值插入到樹狀陣列中,那麼累加樹狀陣列中所有下標小於等於i.x的元素鍵值之和累加到ans[i]中即可,最後再根據給每個操作打的標記(標記其屬於第幾次查詢)和其對答案的貢獻狀態(+或-)計算每次查詢的結果即可

code

#include

#include

#include

#include

using namespace std;

#define maxn 1111111

ints,n,res,tot,ans[maxn],cnt,h[maxn];

struct node

; node(int

x,int

y,int num,int id,int sta,int flag,int ans):x(x),y(y),num(num),id(id),sta(sta),flag(flag),ans(ans){};

bool operator <(const node &a)const

void update(int

x,int v)

}int query(int

x)

return ans;

}}bit;

void cdq(int l,int r)

for(int i=l;iif(p[i].num)bit.update(p[i].x,-p[i].num);

merge(p+l,p+mid+1,p+mid+1,p+r+1,q);

for(int i=0;i1;i++)p[l+i]=q[i];

}int main()

else

if(op==2)

}

sort(h+1,h+cnt+1);

cnt=unique(h+1,h+cnt+1)-h-1;

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

cdq(1,res);

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

ans[p[i].flag]+=p[i].sta*p[i].ans;

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

printf("%d\n",ans[i]);

}return

0;}

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

bzoj 1176 cdq分治套樹狀陣列

題面 維護乙個w w的矩陣,初始值均為s.每次操作可以增加某格仔的權值,或詢問某子矩陣的總權值.修改運算元m 160000,詢問數q 10000,w 2000000.input 第一行兩個整數,s,w 其中s為矩陣初始值 w為矩陣大小 接下來每行為一下三種輸入之一 不包含引號 1 x y a 2 x...

BZOJ4698 差分 二分 SA

這題的難點在於相同的定義,在這樣的定義下一般的字串匹配演算法就不適用了。但是可以通過乙個操作,將前後相鄰的字串差分形成乙個長度為len 1的差分串,原來的相同下的定義就轉為了差分串的完全相同,證明顯然。在這種情況下,再把字串全部拼接起來,用特殊字元隔開,然後二分他們的長度去做字尾陣列,看有沒有相鄰的...