[HNOI 2001]矩阵乘积

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\n",b[y]);
52     return 0;
53 }

 

 

 

posted @ 2017-08-20 19:49  NaVi_Awson  阅读(349)  评论(0编辑  收藏  举报