Description
Input
Output
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 ;
}