链接
http://www.lydsy.com/JudgeOnline/problem.php?id=2901
题解
傻逼题,直接前缀和乱搞就好了。
然后卡卡常就过了。
别忘了读入优化。
我还是简述一下吧,每次显然是问你第一个矩阵的某几个连续的行和第二个矩阵的某几个连续列的矩阵乘积,乘出来的矩阵求下和。
显然第一个矩阵竖着求下前缀和,第二个矩阵横着求下前缀和,然后每次暴力乘,就过了。
代码
//乱搞题
#include <cstdio>
#include <algorithm>
#define ll long long
#define maxn 2100
using namespace std;
ll m1[maxn][maxn], m2[maxn][maxn], N, M;
inline ll read(ll x=0)
{
char c=getchar();
while(c<48 or c>57)c=getchar();
while(c>=48 and c<=57)x=(x<<1)+(x<<3)+c-48,c=getchar();
return x;
}
void init()
{
ll i, j;
N=read(), M=read();
for(i=1;i<=N;i++)for(j=1;j<=N;j++)m1[i][j]=read();
for(i=1;i<=N;i++)for(j=1;j<=N;j++)m2[j][i]=read();
for(i=1;i<=N;i++)for(j=1;j<=N;j++)m1[i][j]+=m1[i-1][j];
for(i=1;i<=N;i++)for(j=1;j<=N;j++)m2[i][j]+=m2[i-1][j];
}
char s[100];
int top;
void mult(ll a, ll b, ll c, ll d)
{
ll i, ans=0;
for(i=1;i<=N;i++)ans+=(m1[c][i]-m1[a-1][i])*(m2[d][i]-m2[b-1][i]);
printf("%lld\n",ans);
}
int main()
{
ll a, b, c, d;
init();
while(M--)
{
a=read(), b=read(), c=read(), d=read();
if(a>c)swap(a,c);
if(b>d)swap(b,d);
mult(a,b,c,d);
}
return 0;
}