[HNOI 2001]矩阵乘积

时间:2023-03-09 07:45:24
[HNOI 2001]矩阵乘积

Description

[HNOI 2001]矩阵乘积

[HNOI 2001]矩阵乘积

Input

[HNOI 2001]矩阵乘积

Output

[HNOI 2001]矩阵乘积

Sample Input

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

Sample Output

12

题解

直接做$O(n^3)$是肯定过不了的

由于只要求最后的$(x,y)$的值,

那么对于第一个矩阵我们只要管第$x$行,

第三个矩阵只要管$y$列,

由于满足数的乘法的分配率,我们可以边输入边处理。

这道题比较麻烦的应该在输入上...

我用了另外的三个变量记录上一次输入的$i$,$j$,$a$的值,就方便判断了。

 #include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
using namespace std;
const int N=; int x,y,n,m,o,p;
int a[N+],b[N+];
int i,j,c,li,lj,lc; int main()
{
scanf("%d%d%d%d%d%d",&x,&y,&n,&m,&o,&p);
scanf("%d%d%d",&i,&j,&c);
while (true)
{
if (i==x) a[j]=c;
li=i,lj=j,lc=c;
scanf("%d%d%d",&i,&j,&c);
if (i<li||i==li&&j<=lj) break;
}
while (true)
{
b[j]+=a[i]*c;
li=i,lj=j,lc=c;
scanf("%d%d%d",&i,&j,&c);
if (i<li||i==li&&j<=lj) break;
}
memcpy(a,b,sizeof(a));
memset(b,,sizeof(b));
while(true)
{
if (j==y) b[y]+=a[i]*c;
li=i,lj=j,lc=c;
scanf("%d%d%d",&i,&j,&c);
if (i<li||i==li&&j<=lj) break;
}
printf("%d\n",b[y]);
return ;
}