HDU 6336 Matrix from Arrays(循环节)
程序员文章站
2022-07-12 09:31:18
...
题目链接:Matrix from Arrays
题意
给定一个长度为 的数组 ,用以下代码生成一个无穷大矩阵:
int cursor = 0;
for (int i = 0; ; ++i) {
for (int j = 0; j <= i; ++j) {
M[j][i - j] = A[cursor];
cursor = (cursor + 1) % L;
}
}
有 次询问,每次询问为从第 行 列到第 行 列的子矩阵中数字的和。
输入
第一行为一个整数 ,接下有 组数据,每组数据第一行为一个整数 ,第二行为 个整数 ,第三行为一个整数 ,接下去 行每行四个整数 。
输出
对于每次询问,输出结果。
样例
输入 |
---|
1 3 1 10 100 5 3 3 3 3 2 3 3 3 2 3 5 8 5 1 10 10 9 99 999 1000 |
输出 |
1 101 1068 2238 33076541 |
题解
打表可以发现矩阵的循环节为 ,因此可以只打出 的矩阵,就可以通过循环节求出所有矩阵的值,设 为无穷大矩阵前 行 列的和,则所求子矩阵的和为
注意 取得 的情况。
过题代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <sstream>
using namespace std;
#define LL long long
const int maxn = 100 + 100;
int T, n, q;
int a[maxn];
LL num[maxn][maxn];
LL Sum(int x, int y) {
if(x < 0 || y < 0) {
return 0;
}
int nn = n << 1;
LL ret = num[nn - 1][nn - 1] * ((x + 1) / nn) * ((y + 1) / nn);
int xx = x % nn;
int yy = y % nn;
if(xx != nn - 1) {
ret += num[xx][nn - 1] * ((y + 1) / nn);
}
if(yy != nn - 1) {
ret += num[nn - 1][yy] * ((x + 1) / nn);
}
if(xx != nn - 1 && yy != nn - 1) {
ret += num[xx][yy];
}
return ret;
}
int main() {
#ifdef Dmaxiya
freopen("test.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif // Dmaxiya
ios::sync_with_stdio(false);
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int Index = 0;
for(int i = 0; i < maxn; ++i) {
for(int j = 0; j <= i; ++j) {
num[j][i - j] = a[Index];
Index = (Index + 1) % n;
}
}
for(int i = 0; i < maxn; ++i) {
for(int j = 0; j < maxn; ++j) {
if(i != 0) {
num[i][j] += num[i - 1][j];
}
if(j != 0) {
num[i][j] += num[i][j - 1];
}
if(i != 0 && j != 0) {
num[i][j] -= num[i - 1][j - 1];
}
}
}
scanf("%d", &q);
int x1, x2, y1, y2;
while(q--) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
LL ans = Sum(x2, y2) + Sum(x1 - 1, y1 - 1);
ans -= Sum(x2, y1 - 1) + Sum(x1 - 1, y2);
printf("%I64d\n", ans);
}
}
return 0;
}
上一篇: Python 实用小技巧精选收藏
下一篇: 矩阵相关
推荐阅读
-
【hdu 6336】 Matrix from Arrays
-
HDU 6336 Matrix from Arrays(循环节)
-
hdu 6336 Matrix from Arrays
-
HDU 6336 Problem E. Matrix from Arrays(找规律)
-
hdu6336 多校第四场E题 Matrix from Arrays
-
HDU 6336 Matrix from Arrays(找规律)
-
hdu 6336 Problem E. Matrix from Arrays
-
杭电第四场 hdu6336 Problem E. Matrix from Arrays 打表找规律 矩阵前缀和(模板)
-
HDU6336 Problem E. Matrix from Arrays
-
杭电多校04补题 HDU6336 Problem E. Matrix from Arrays【构造】