BZOJ 2901 矩陣求和 字首和

2021-08-07 15:38:47 字數 1691 閱讀 2305

time limit: 20 sec  memory limit: 256 mb

submit: 512  solved: 289

[submit][status][discuss]

給出兩個n*n的矩陣,m次詢問它們的積中給定子矩陣的數值和。

第一行兩個正整數n,m。

接下來n行,每行n個非負整數,表示第乙個矩陣。

接下來n行,每行n個非負整數,表示第二個矩陣。

接下來m行,每行四個正整數a,b,c,d,表示詢問第乙個矩陣與第二個矩陣的積中,以第a行第b列與第c行第d列為頂點的子矩陣中的元素和。

對每次詢問,輸出一行乙個整數,表示該次詢問的答案。

3 21 9 8

3 2 0

1 8 3

9 8 4

0 5 15

1 9 6

1 1 3 3

2 3 1 2

661388

【資料規模和約定】

對30%的資料滿足,n <= 100。

對100%的資料滿足,n <= 2000,m <= 50000,輸入資料中矩陣元素 < 100,a,b,c,d <= n。

傳送門

不妨設a<=c,b<=d,那麼∑i

=ac∑

j=bd

r[i]

[j]=

∑i=a

c∑j=

bd∑k

=1np

[i][

k]⋅q

[k][

j]=∑

k=1n

(∑i=

acp[

i][k

])⋅(

∑j=b

dq[k

][j]

)=∑k

=1n(

sump

[c][

k]−s

ump[

a−1]

[k])

(sum

q[k]

[d]−

sumq

[k][

b−1]

)

時間複雜度

o(nm)

,可過。

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}void print(ll x)

const int n=2010;

ll suma[n][n],sumb[n][n];

int main()

for(i=1;i<=n;++i)for(j=1;j<=n;++j)

register int a,b,c,d;

while(m--)

return 0;}/*

3 21 9 8

3 2 0

1 8 3

9 8 4

0 5 15

1 9 6

1 1 3 3

2 3 1 2

661388

*/

BZOJ 2901 矩陣求和

bzoj 2901 矩陣求和 字首和 給出兩個n n的矩陣,m次詢問它們的積中給定子矩陣的數值和。第一行兩個正整數n,m。接下來n行,每行n個非負整數,表示第乙個矩陣。接下來n行,每行n個非負整數,表示第二個矩陣。接下來m行,每行四個正整數a,b,c,d,表示詢問第乙個矩陣與第二個矩陣的積中,以第a...

BZOJ 2901 矩陣求和

time limit 20 sec memory limit 256 mb submit 411 solved 216 submit status discuss 給出兩個n n的矩陣,m次詢問它們的積中給定子矩陣的數值和。第一行兩個正整數n,m。接下來n行,每行n個非負整數,表示第乙個矩陣。接下來...

輸入掛(bzoj 2901 矩陣求和)

很少用輸入掛,以為不超時就好了,但是這題貌似不用過不去啊 只好拿出來用了,當個模板 原理是用getchar 讀入會比用scanf快一些 int read while ch 0 ch 9 x x 10 ch 0 ch getchar return x f time limit 20 sec memor...