CDQ求子矩陣的和

2022-05-01 11:00:06 字數 2211 閱讀 6676

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 41 2 3 3

2 1 1 3 3

1 2 2 2

2 2 2 3 4

3sample output35

hint

保證答案不會超過int範圍

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define fou(i,x,y) for(int i=x;i<=y;i++)

#define fod(i,x,y) for(int i=x;i>=y;i--)

#define mem(a,val) memset(a,val,sizeof(a))

#define pi acos(-1.0)

const

double exp = 1e-9

;typedef

long

long

ll;typedef unsigned

long

long

ull;

const

int inf = 0x3f3f3f3f

;const ll minf = 0x3f3f3f3f3f3f3f3f

;const

double dinf = 0xffffffffffff

;const

int mod = 1e9+7

;const

int n = 2e6+5;

struct

nodea[n],tmp[n];

intn,w,tot;

int ans[10005]; //

答案陣列

bool

cmp(node a,node b)

int tree[n]; //

tree陣列按二進位制存,根據n的末尾0的個數訪問,樹狀陣列

int lowbit(intx)

int query(int x) //

返回1到x的字首和

return

res;}

void add(int x,int v) //

實現a[x]+v;}

void clearr(intx)}

void cdq(int l,int

r)

else

}while(p<=mid)

while(q<=r)

for(int i=l;i<=r;i++)}

intmain()

; }

else

;

//因為他是中間矩陣,而我們加是1~x,1~y的加,所以多出來的要賦值成-1,來減掉,val賦值-1

a[++m]=node;

a[++m]=node;

//這裡多減了一次,要加回來,val賦值1

a[++m]=node;

ans[tot]+=(x2-x1+1)*(y2-y1+1)*s; //

答案賦初值

} }

sort(a+1,a+1+m,cmp);

cdq(

1,m);

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

printf(

"%d\n

",ans[i]);

return0;

}

view code

矩陣中求子矩形

有乙個 n的矩形,其中每個元素只可能是0or1。比如如下矩陣a 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1其中a 0 0 a 0 1 a 3 0 a 3 1 這四個元素恰好是乙個長方形的四個角,且每個元素都是1.因此稱這四個元素圍成了乙個子矩形。現在需要判斷,給定的矩陣a中,判斷...

LA3029 矩陣中求子矩陣最大問題

la3029 題意給你乙個矩陣,每個單元格要麼為空,要麼為滿,求全是空的最大子矩陣的格仔數 3.最樸素的演算法是列舉所有的子矩陣的左上角的點和右下角的點,這樣就能確定乙個矩形,然後再遍歷這個矩陣,看矩陣是否全是空。複雜度大概是o m 2 n 2 通過掃瞄法,每次維護left i j right i ...

求子陣列和的最大值

題目要求 輸入乙個一維整形陣列,陣列裡有正數也有負數。一維陣列首尾相接,像個一條首尾相接帶子一樣。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。程式設計思路 1 首先建立乙個一維陣列a,進行資料儲存。2 定義變數,n用於求和,m為和最大值 3 開始for迴...