BZOJ_2901_矩阵求和_前缀和

Description

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

Input

第一行两个正整数n,m。
接下来n行,每行n个非负整数,表示第一个矩阵。
接下来n行,每行n个非负整数,表示第二个矩阵。
接下来m行,每行四个正整数a,b,c,d,表示询问第一个矩阵与第二个矩阵的积中,以第a行第b列与第c行第d列为顶点的子矩阵中的元素和。

Output

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

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

【数据规模和约定】
对30%的数据满足,n <= 100。
对100%的数据满足,n <= 2000,m <= 50000,输入数据中矩阵元素 < 100,a,b,c,d <= n。


$\sum\limits_{i=1}^{x}\sum\limits_{j=1}^{y}\sum\limits_{k=1}^{n}A_{ik}*B_{kj}$

$=\sum\limits_{k=1}^{n}\sum\limits_{i=1}^{n}A_{ik}\sum\limits_{j=1}^{y}B_{kj}$

处理出前缀和之后每次O(n)查一遍。
 
代码:
// bzoj-judger-enable-ogay
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int sa[2050][2050],sb[2050][2050],n,m;
char buf[100000],*p1=buf,*p2=buf;
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
__attribute__((optimize("-O998244353")))int rd() {
int x=0; char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+s-'0',s=nc();
return x;
}
char pbuf[100000],*pp=pbuf;
__attribute__((optimize("-O998244353")))void push(const char ch) {
if(pp-pbuf==100000) fwrite(pbuf,1,100000,stdout),pp=pbuf;
*pp++=ch;
}
__attribute__((optimize("-O998244353")))void write(ll x) {
static int sta[70];
int top=0;
do{sta[++top]=x%10,x/=10;}while(x);
while(top) push(sta[top--]+'0');
push('\n');
}
__attribute__((optimize("-O998244353")))ll qu(int x,int y,int z,int w) {
int i;
ll re=0;
for(i=1;i<=n;i++) re+=ll(sa[z][i]-sa[x-1][i])*(sb[i][w]-sb[i][y-1]);
return re;
}
__attribute__((optimize("-O998244353")))int main() {
n=rd(); m=rd();
register int i,j,x;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
x=rd(); sa[i][j]=sa[i-1][j]+x;
}
}
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
x=rd(); sb[i][j]=sb[i][j-1]+x;
}
}
int y,z,w;
while(m--) {
x=rd(); y=rd(); z=rd(); w=rd();
if(x>z) swap(x,z); if(y>w) swap(y,w);
write(qu(x,y,z,w));
}
fwrite(pbuf,1,pp-pbuf,stdout);
}

最新文章

  1. vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)
  2. 2014 Super Training #1 F Passage 概率DP
  3. eclipse自动补全
  4. 用Java实现菱形的打印输出
  5. WPF仿360卫士9.0界面设计
  6. 【JavaScript】对比12 款优秀的JavaScript MVC/MVVC框架 你最喜欢Backbone or Ember
  7. 从内部剖析C# 集合之--Dictionary
  8. 每天一个JavaScript实例-canvas绘图
  9. View Component
  10. n皇后问题 [随机化算法,拉斯维加斯算法]
  11. apacheds的客户端
  12. [LeetCode] Find And Replace in String 在字符串中查找和替换
  13. [Swift]LeetCode491. 递增子序列 | Increasing Subsequences
  14. keras神经网络做简单的回归问题
  15. Huawei BGP和OSPF双边界重分布(一)
  16. 转载:遇到BITMAP CONVERSION TO ROWIDS 后解决与思考
  17. 转载:Quartz.NET 入门
  18. JS的小判断
  19. spring boot 在不同环境下读取不同配置文件的一种方式
  20. xcode 8 清除无用的打印

热门文章

  1. Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)
  2. 启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决-及eclipse版本查看
  3. C 标准库 - &lt;errno.h&gt;
  4. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
  5. bat+sqlcmd 批量执行脚本
  6. 【Sprint3冲刺之前】项目可行性研究报告
  7. VM(转)
  8. 用redis实现跨服务器session(转)
  9. Codeforces Round #267 (Div. 2) B. Fedor and New Game
  10. Active Directory虚拟机搭建域控服务器环境