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