题目描写叙述 Description

给出两个n*n的矩阵。m次询问它们的积中给定子矩阵的数值和。

输入描写叙述 Input Description

第一行两个正整数n,m。

接下来n行,每行n个非负整数。表示第一个矩阵。

接下来n行,每行n个非负整数。表示第二个矩阵。

接下来m行。每行四个正整数a。b,c,d,表示询问第一个矩阵与第二个矩阵的积中。

以第a行第b列与第c行第d列为顶点的子矩阵中的元素和。

输出描写叙述 Output Description

对每次询问,输出一行一个整数。表示该次询问的答案。

例子输入 Sample Input

3 2

1 9 8

3 2 0

1 8 3

9 8 4

0 5 15

1 9 6

1 1 3 3

2 3 1 2

例子输出 Sample Output

661

388

数据范围及提示 Data Size & Hint

【数据规模和约定】

对30%的数据满足,n <= 100。

对100%的数据满足。n <= 2000,m <= 50000,输入数据中矩阵元素 < 100,a。b。

c,d <= n。

题解:

这个题尽管名字是矩阵乘法。可是和矩阵高速幂一点关系也没有。。

30%做法:

直接两个矩阵暴力相乘,然后再暴力询问。(ps:集训队的题居然给这么多暴力分)

100%做法:

如果你对矩阵乘法足够了解的话。能够发现我们事实上能够在O(n)的复杂度内处理出每次询问。

设要求和的矩阵为A(x1,x2,y1,y2);第一个矩阵为a,第二个矩阵为b那么矩阵A能够分行来计算

如果A矩阵第一行(x1)的元素为p[i];

那么依据矩阵乘法的法则

p[i]等于a矩阵的第X1行的元素和b矩阵的第i列的元素相应相乘。再相加。

sigma{p[i]}(y1<=i<=y2)为a矩阵的第X1行的元素分别和b矩阵的第y1到y2列的元素相应相乘,再相加。

那么我们能够发现这个式子能够使用乘法结合律提出a矩阵第x1行的元素。再用第i个元素与b矩阵第i列的和相乘,最后把所得的乘积相加,

同理第二行第三行也都一样,

我们会发现不同行之间也能够提取出b矩阵中每一列的和,

那么最后所询问矩阵的和就为a矩阵第x1-x2行每行的元素和与b矩阵第y1-y2列的每列的元素和相应相乘再相加。

所以仅仅要预处理出a矩阵每一行的前缀和

b矩阵每一列的前缀和就可以

时间复杂度O(n^2+n*m);

注意使用scanf或读入优化。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define read(x) scanf("%d",&x);
int n,m,x,y,xx,yy,aa[2001][2001]={0},bb[2001][2001]={0},a,b;
int main()
{
read(n);read(m);
For(i,n) For(j,n)
{
read(a);
aa[i][j]=aa[i-1][j]+a;
}
For(i,n) For(j,n)
{
read(b);
bb[i][j]=bb[i][j-1]+b;
}
For(i,m)
{
read(x);read(y);read(xx);read(yy);
long long ans=0;
if (x>xx) swap(x,xx);
if (y>yy) swap(y,yy);
For(j,n)
ans+=(long long)(aa[xx][j]-aa[x-1][j])*(long long)(bb[j][yy]-bb[j][y-1]);
printf("%lld\n",ans);
}
}

矩阵乘法2(codevs3147)的更多相关文章

  1. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  2. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  4. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  5. bzoj 2738 矩阵乘法

    其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...

  6. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  7. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

  8. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

  9. 矩阵乘法的MapReduce实现

    对于任意矩阵M和N,若矩阵M的列数等于矩阵N的行数,则记M和N的乘积为P=M*N,其中mik 记做矩阵M的第i行和第k列,nkj记做矩阵N的第k行和第j列,则矩阵P中,第i行第j列的元素可表示为公式( ...

随机推荐

  1. lightoj--1214--Large Division(大数取余)

    Large Division Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit ...

  2. hpuoj--校赛--爬楼梯(模拟)

    问题 E: 感恩节KK专场--爬楼梯 时间限制: 1 Sec  内存限制: 1000 MB 提交: 382  解决: 89 [提交][状态][讨论版] 题目描述 来机房比赛的时候大家都会爬楼梯,但是每 ...

  3. 解决夸dll返回dynamic无法访问

    public static class DynamicFactory { //创建线程安全(对象不会再同一时刻被多个线程访问)的字典对象 private static ConcurrentDictio ...

  4. js实现图片上传后即时预览

    //关于FileReader对象 http://blog.csdn.net/zk437092645/article/details/8745647 <!DOCTYPE html> < ...

  5. Playing With Stones UVALive - 5059 Nim SG函数 打表找规律

    Code: #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll ...

  6. elementui的时间选择器开始时间和结束时间的限制

    开始时间不能大于结束时间 html代码部分 方法部分 开始时间和结束时间可以选同一天 <template> <div class="range-wrapper"& ...

  7. phpstorm10安装并汉化

    一.下载phpstorm 下载地址:https://pan.baidu.com/s/1R64ZROVP1ljGbYfCwWjwxA 二.一直点击下一步安装即可 注意:第3步的时候选择一下支持的后缀 三 ...

  8. Unity C# 设计模式(七)适配器模式

    定义: 将一个类的接口转换成客户希望的另一个接口.adapter模式使得原本由于接口不兼容而不能在一起的那些类可以一起工作. 示例代码: 1.类适配器 /* Class Adapter:类适配器,这里 ...

  9. 在kettle中实现数据验证和检查

    在kettle中实现数据验证和检查 在ETL项目,输入数据通常不能保证一致性.在kettle中有一些步骤能够实现数据验证或检查.验证步骤能够在一些计算的基础上验证行货字段:过滤步骤实现数据过滤:jav ...

  10. Java基本数据类型及字节

    1.基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double.数值类型又可以分为整数类型byte.short.int. ...