任意门: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. [转]让ASP.NET Web API支持$format参数的方法

    本文转自:http://www.cnblogs.com/liuzhendong/p/4228592.html 在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数, ...

  2. 项目开发-->基础功能汇总

    祭奠曾经逝去的青春…… 1.基础功能汇总-->身份认证及用户登录模块 2.基础功能汇总-->一键登录功能汇总 3.堆和栈 4.变量

  3. spring-boot之入门实践

    spring-boot是spring的一种微服务框架,spring-boot的出现是为了解决以往spring项目中xml文件繁琐的配置.具体介绍参考:http://docs.spring.io/spr ...

  4. .net core 填坑记之二目录问题(获取当前目录、创建目录)

    1.获取应用程序运行当前目录Directory.GetCurrentDirectory(). System.IO命名空间中存在Directory类,提供了获取应用程序运行当前目录的静态方法GetCur ...

  5. [android] 天气app布局练习(四)

    主要练习一下获取网络数据和解析xml MainActivity.java package com.example.weatherreport; import java.io.UnsupportedEn ...

  6. 互联网轻量级框架SSM-查缺补漏第六天【级联+延迟加载特辑】

    简言:本来这是昨天看的,但是因为想好好写一下[级联]这个东西,所以就看完之后今天来整理一下. 级联 1. 什么是级联 级联是一个数据库实体的概念.比如教师就需要存在学生与之对应,这样就有教师学生表,一 ...

  7. 使用RabbitMQ实现延迟任务----实用场景

    1. 使用RabbitMQ实现延迟任务

  8. H5前端的关于像素解释

    场景: 人物:前端实习生「阿树」与 切图工程师「玉凤」 事件:设计师出设计稿,前端实现页面 玉凤:树,设计稿发给你啦,差那么点像素,就叼死你┏(  ̄へ ̄)=☞ 阿树:~(>_<)~毛问题噶 ...

  9. html+css 布局篇

    float 做了float后有一些不好的影响. 1.背景不能显示 由于浮动产生,如果对父级设置了(CSS background背景)CSS背景颜色或CSS背景图片,而父级不能被撑开,所以导致CSS背景 ...

  10. WPF中使用定时器 DispatcherTimer 做TCP连接中的心跳 HeartBeat

    开发过程中经常遇到定时触发的需求,如:TCP/IP连接中,使用心跳包保持连接或检测连接是否已经中断. WPF中有多种定时器: 1.using System.Windows.Threading; 代码如 ...