2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】
任意门: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
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.
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).
题意概括:
给一个长度为 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 【打表+二维前缀和】的更多相关文章
- 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 ...
- 杭电第四场 hdu6336 Problem E. Matrix from Arrays 打表找规律 矩阵前缀和(模板)
Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 ...
- BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4972 八月月赛Problem B 题目概括 一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角 ...
- HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)
6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...
- 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 ...
- 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- VMware workstation 非正常关机导致开机失败,解决方法
问题:VMware workstation 非正常关机导致开机失败!如下图:
- pdf OCR
pdf转word等其他可排版编辑格式的软件: ABBYY Finereader: 老牌OCR软件了,支持各种文字.图片.表格的识别,效率比较高,中文的识别效果也很好,公式的转换效率较差. InftyR ...
- Entity Framework6 with Visual Studio 2013 update3 for Oracle 11g
2014年7月的时候,写了一篇关于EF5 with visual studio 2010 for oracle 11g的博文 原文地址 :http://www.cnblogs.com/HouZhiHo ...
- Java - 生成keystore
有个需求,说要在生成PDF文件时加上signature.操作PDF容易,用: <dependency> <groupId>com.itextpdf</groupId> ...
- ThreadLocal介绍以及源码分析
ThreadLocal 线程主变量 前面部分引用其他优秀博客,后面源码自己分析的,如有冒犯请私聊我. 用Java语言开发的同学对 ThreadLocal 应该都不会陌生,这个类的使用场景很多,特别是在 ...
- oracle OCI lob操作
可以有两种方式来bind lob字段 1)直接绑定lob 值 2)绑定lob locator指针 对于 直接绑定lob值的操作如下 char* sql = "insert into tab_ ...
- git记住提交密码的技巧
修改.git包里面的config文件,添加 [credential] helper = store
- 【原创】MapReduce程序如何在集群上执行
首先了解下资源调度管理框架Yarn. Yarn的结构(如图): Resource Manager (rm)负责调度管理整个集群上的资源,而每一个计算节点上都会有一个Node Manager(nm)来负 ...
- flask_restful的使用方法
一 安装: pip install flask_restrul 二 初始化并注册路由 # run.py from flask_restful import Api ... api = Api(app) ...
- c# 获取文件夹大小
private long GetDirectorySizeMethod1(string directory) { long directorySize = 0; DirectoryInfo di = ...