[HNOI2001]矩阵乘积
题目描述
输入输出格式
输入格式:第1行为:x y (第1行为两个正整数:x,y分别表示输出结果所在的行和列)
第2行为:m n o p(第2行给出的正整数表明A为m×n矩阵,B为n×o矩阵,C为o×p矩阵)
第3行为:i j a(第3行以后的每一行有三个整数分别是矩阵的三元组表示法中的一个元素的值,每个矩阵之间有一个空行。表示的顺序是矩阵A、B和C)
… … … … … …
注:1≤m,n,o,p≤6000,三元数组的总个数不大于6000。数据之间用空格分开。
输出格式:为 的第x行第y列元素的值。
输入输出样例
输入样例#1:
1 2 3 4 2 3 1 1 3 1 4 5 2 2 1 3 1 2 1 2 2 2 1 1 3 1 2 3 2 4 1 2 2 1 3 3 2 1 1 2 2 2
输出样例#1:
12
只需要(x,y)的值
ans(x,y)=∑B[x][k]*c[k][y]
B[i][k]=∑a[i][p]*b[p][k]
所以可以只求一部分的值
输入部分用一种水法,还好数据弱
如果前面输入(i,j),后面输入(a,b)
(a,b)<(i,j) 则为另一矩阵
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int m,n,o,p,x,y,A[6001],B[6001]; 7 int main() 8 {int a,b,c,i,j,z; 9 cin>>x>>y; 10 cin>>m>>n>>o>>p; 11 scanf("%d%d%d",&a,&b,&z); 12 while (1) 13 { 14 if (a==x) A[b]=z; 15 scanf("%d%d%d",&i,&j,&c); 16 if (i<a||(i==a&&j<=b)) break; 17 a=i;b=j;z=c; 18 } 19 a=i;b=j;z=c; 20 while (1) 21 { 22 B[b]+=A[a]*z; 23 scanf("%d%d%d",&i,&j,&c); 24 if (i<a||(i==a&&j<=b)) break; 25 a=i;b=j;z=c; 26 } 27 memcpy(A,B,sizeof(A)); 28 memset(B,0,sizeof(B)); 29 a=i;b=j;z=c; 30 while (1) 31 { 32 if (b==y) B[b]+=A[a]*z; 33 scanf("%d%d%d",&i,&j,&c); 34 if (i<a||(i==a&&j<=b)) break; 35 a=i;b=j;z=c; 36 } 37 cout<<B[y]<<endl; 38 }