[HNOI2001]矩阵乘积

Posted Z-Y-Y-S

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 }

 



以上是关于[HNOI2001]矩阵乘积的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2001 HNOI2010 城市建设

算法最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)

BZOJ 3571 [Hnoi2014]画框(最小乘积完美匹配)

bzoj1221: [HNOI2001] 软件开发

BZOJ 1221: [HNOI2001] 软件开发

BZOJ2001 [Hnoi2010]City 城市建设 CDQ分治