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$的值,就方便判断了。
1 #include<set> 2 #include<map> 3 #include<cmath> 4 #include<ctime> 5 #include<queue> 6 #include<stack> 7 #include<cstdio> 8 #include<string> 9 #include<vector> 10 #include<cstdlib> 11 #include<cstring> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 #define RE register 16 #define IL inline 17 using namespace std; 18 const int N=6000; 19 20 int x,y,n,m,o,p; 21 int a[N+5],b[N+5]; 22 int i,j,c,li,lj,lc; 23 24 int main() 25 { 26 scanf("%d%d%d%d%d%d",&x,&y,&n,&m,&o,&p); 27 scanf("%d%d%d",&i,&j,&c); 28 while (true) 29 { 30 if (i==x) a[j]=c; 31 li=i,lj=j,lc=c; 32 scanf("%d%d%d",&i,&j,&c); 33 if (i<li||i==li&&j<=lj) break; 34 } 35 while (true) 36 { 37 b[j]+=a[i]*c; 38 li=i,lj=j,lc=c; 39 scanf("%d%d%d",&i,&j,&c); 40 if (i<li||i==li&&j<=lj) break; 41 } 42 memcpy(a,b,sizeof(a)); 43 memset(b,0,sizeof(b)); 44 while(true) 45 { 46 if (j==y) b[y]+=a[i]*c; 47 li=i,lj=j,lc=c; 48 scanf("%d%d%d",&i,&j,&c); 49 if (i<li||i==li&&j<=lj) break; 50 } 51 printf("%d ",b[y]); 52 return 0; 53 }