任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336

Problem E. Matrix from Arrays

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1711    Accepted Submission(s): 794

Problem Description
Kazari has an array A length of L, she plans to generate an infinite matrix M using A.
The procedure is given below in C/C++:

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;
}
}

Her friends don't believe that she has the ability to generate such a huge matrix, so they come up with a lot of queries about M, each of which focus the sum over some sub matrix. Kazari hates to spend time on these boring queries. She asks you, an excellent coder, to help her solve these queries.

 
Input
The first line of the input contains an integer T (1≤T≤100) denoting the number of test cases.
Each test case starts with an integer L (1≤L≤10) denoting the length of A.
The second line contains L integers A0,A1,...,AL−1 (1≤Ai≤100).
The third line contains an integer Q (1≤Q≤100) denoting the number of queries.
Each of next Q lines consists of four integers x0,y0,x1,y1 (0≤x0≤x1≤108,0≤y0≤y1≤108) querying the sum over the sub matrix whose upper-leftmost cell is (x0,y0) and lower-rightest cell is (x1,y1).
 
Output
For each test case, print an integer representing the sum over the specific sub matrix for each query.
Sample Input
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
 
Sample Output
1
101
1068
2238
33076541
 
Source

题意概括:

给一个长度为 L 的序列,要求按照代码的要求构建一个矩阵。

Q次查询,每次查询输入矩阵的左上角和右下角坐标,输出矩阵的值的总和。

解题思路:

并没有什么过人的天分,老老实实把构建的矩阵输出来找规律。

发现大矩阵是长宽 为 2*L 的小矩阵构造而成的。

问题就转换为了类似于求矩阵面积的问题,也就可以通过二维前缀和 sum(x, y) 来求解答案。

例如要求解 (x1, y1, x2, y2) 的值就等于 sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1);

如何计算 sum(x, y)呢?首先统计有多少个 2L * 2L 的子矩阵,然后再单独加上这些除掉这些子矩阵的其余部分。

AC code:

 #include<set>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = 1e3+;
LL sum;
int mmp[MAXN][MAXN];
int N, M, L, Q;
LL sum1[MAXN], sum2[MAXN];
int A[MAXN]; void init()
{
memset(mmp, , sizeof(mmp));
memset(sum1, , sizeof(sum1));
memset(sum2, , sizeof(sum2));
int cnt = ;
for(int i = ; i < *L; i++){
for(int j = ; j <= i; j++){
mmp[j][i-j] = A[cnt];
cnt = (cnt+)%L;
}
}
sum = ;
for(int i = ; i < *L; i++){
for(int j = ; j < *L; j++){
sum+=mmp[i][j];
sum1[i] += mmp[i][j];
sum2[j] += mmp[i][j];
}
}
} LL query(int x, int y)
{
int cnt_x = (x+)/(*L);
int cnt_y = (y+)/(*L);
LL res = sum*cnt_x*cnt_y;
int lenx = (x+)%(*L);
int leny = (y+)%(*L); for(int i = ; i < lenx; i++) res+= cnt_y*sum1[i];
for(int j = ; j < leny; j++) res+= cnt_x*sum2[j]; for(int i = ; i < lenx; i++)
for(int j = ; j < leny; j++){
res+=mmp[i][j];
} return res;
} int main()
{
int T_case;
int x1, x2, y1, y2;
scanf("%d", &T_case);
while(T_case--){
scanf("%d", &L);
for(int i = ; i < L; i++){
scanf("%d", &A[i]);
}
init(); scanf("%d", &Q);
while(Q--){
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
LL ans = query(x2, y2)-query(x1-, y2) - query(x2, y1-) + query(x1-, y1-);
printf("%lld\n", ans);
}
}
return ;
}

2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】的更多相关文章

  1. HDU - 6336 Problem E. Matrix from Arrays (规律+二维前缀和)

    题意: for (int i = 0; ; ++i) { for (int j = 0; j <= i; ++j) { M[j][i - j] = A[cursor]; cursor = (cu ...

  2. 杭电第四场 hdu6336 Problem E. Matrix from Arrays 打表找规律 矩阵前缀和(模板)

    Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 ...

  3. BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4972 八月月赛Problem B 题目概括 一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角 ...

  4. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

  5. 2018 Nowcoder Multi-University Training Contest 2

    目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...

  6. 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛

    子串查询 Time Limit: 3500/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  7. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  8. 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...

  9. 2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 200 ...

随机推荐

  1. 【Bigdecimal】

    ---恢复内容开始--- 大位数除法的时候注意1/3问题:异常:[Exception in thread "main" java.lang.ArithmeticException: ...

  2. Javascript屏蔽鼠标的右键的两种方法。

    方法一:利用鼠标button的键值 <script language="javascript"> function blockright(oEvent) { var o ...

  3. Oracle OCI操作UDT相关学习

    1.Oracle数据类型 Oracle的数据类型如下 字符串类型 char nchar varchar2 nvarchar2 数值类型 int number integer smallint 日期类型 ...

  4. gc原理小结

    一.相关概念 基本回收算法 1. 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0 ...

  5. docker 容器中设置 mysql lampp php软链接

    在容器中安装xampp后,进入到终端,直接输入mysql php 发现报错,命令未被发现.如果输入/opt/lampp/bin/mysql   就可以进入了,所以我们要找到在容器中安装的位置,然后将他 ...

  6. js为什么放到head中有时候失效

    1.今天写js碰到一个奇怪的问题,写好的js放到body里面执行,但是放到head中没有任何效果,为什么导致这种原因呢? 看失效代码: <!DOCTYPE html PUBLIC "- ...

  7. Java读取粘贴板内容

    package com.test.jvm.oom.design; import java.awt.Image; import java.awt.Toolkit; import java.awt.dat ...

  8. 【Android】13.0 UI开发(四)——列表控件RecyclerView的横向布局排列实现

    1.0 新建项目,由于ListView的局限性,RecyclerView是一种很好取代ListView的控件,可以灵活实现多种布局. 2.0 新建项目RecyclerviewTest,目录如下: 3. ...

  9. 关于ES7里面的async和await

    async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度,本篇文章将分享asy ...

  10. Python爬虫教程-33-scrapy shell 的使用

    本篇详细介绍 scrapy shell 的使用,也介绍了使用 xpath 进行精确查找 Python爬虫教程-33-scrapy shell 的使用 scrapy shell 的使用 条件:我们需要先 ...