Problem E. Matrix from Arrays

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

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
 
Recommend
chendu   |   We have carefully selected several similar problems for you:  6373 6372 6371 6370 6369 
 
题意:给你一串数字按顺序填充矩阵,询问q次,问(x0,y0)到(x1,y1)的矩阵和
如:
3
1 10 100
是这样填充:
    1    10    1      1  10  ...
100    10  10  100  ...
100  100    1     ...
    1    10   ...
100     ...
分析:通过打表我们可以找出规律(这个得看数学直觉和平常的做题范围了):如果是奇数大小为L*L,如果为偶数大小为2L*2L的矩阵是重复出现,所以循环节我们可以设成2L*2L
  找到规律后我们可以先预处理求出2L*2L的矩阵前缀和,然后把要求的范围分割成多少个2L*2L的矩阵来求
AC代码:
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define ls (r<<1)
#define rs (r<<1|1)
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
const ll maxn = 1e3+10;
const ll mod = 1e9+7;
const double pi = acos(-1.0);
const double eps = 1e-8;
//FILE* fout = fopen("0001.out", "w");
ll n, T;
ll mapn[maxn][maxn], a[maxn];
ll dp[maxn][maxn]; //(i,j)区域的前缀和
ll get( ll s, ll t ) { //这里的s,t由x,y减一得到,有可能产生负数
if( s == -1 || t == -1 ) { //如果s,t为负数,dp的值为0
return 0;
}
ll x = s%n, cnt_x = s/n; //判断s,t范围内由几个2*n的区域组成
ll y = t%n, cnt_y = t/n;
//debug(x), debug(cnt_x), debug(y), debug(cnt_y);
//debug(dp[x][n-1]), debug(dp[n-1][y]), debug(dp[x][y]); return dp[x][n-1]*cnt_y+dp[n-1][y]*cnt_x+dp[n-1][n-1]*cnt_x*cnt_y+dp[x][y];
}
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
scanf("%lld",&T);
while( T -- ) {
memset(dp,0,sizeof(dp));
memset(mapn,0,sizeof(mapn));
scanf("%lld",&n);
for( ll i = 0; i < n; i ++ ) {
scanf("%lld",&a[i]);
}
ll cur = 0;
for( ll i = 0; i <= 100; i ++ ) {
for( ll j = 0; j <= i; j ++ ) {
mapn[j][i-j] = a[cur];
cur = (cur+1)%n;
}
}
dp[0][0] = mapn[0][0];
for( ll i = 1; i < 2*n; i ++ ) {
dp[0][i] = dp[0][i-1] + mapn[0][i];
}
for( ll i = 1; i < 2*n; i ++ ) {
dp[i][0] = dp[i-1][0] + mapn[i][0];
}
for( ll i = 1; i < 2*n; i ++ ) {
for( ll j = 1; j < 2*n; j ++ ) { //求前缀和
dp[i][j] = mapn[i][j] + dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1];
}
}
n = 2*n; //将n变成2*n 因为如果是奇数大小为L*L,如果为偶数大小为2L*2L的矩阵是重复出现
ll q, x0, y0, x1, y1;
scanf("%lld",&q);
while( q -- ) {
scanf("%lld%lld%lld%lld",&x0,&y0,&x1,&y1);
//fprintf( fout, "%lld\n", get(x1,y1)-get(x1,y0-1)-get(x0-1,y1)+get(x0-1,y0-1) );
printf("%lld\n",get(x1,y1)-get(x1,y0-1)-get(x0-1,y1)+get(x0-1,y0-1));
}
}
return 0;
}

  

杭电第四场 hdu6336 Problem E. Matrix from Arrays 打表找规律 矩阵前缀和(模板)的更多相关文章

  1. 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/20 ...

  2. 数学--数论--HDU 1792 A New Change Problem (GCD+打表找规律)

    Problem Description Now given two kinds of coins A and B,which satisfy that GCD(A,B)=1.Here you can ...

  3. A Simple Problem with Integers 循环节 修改 平方 找规律 线段树

    A Simple Problem with Integers 这个题目首先要打表找规律,这个对2018取模最后都会进入一个循环节,这个循环节的打表要用到龟兔赛跑. 龟兔赛跑算法 floyed判环算法 ...

  4. 杭电多校第十场 hdu6432 Cyclic 打表找规律

    Cyclic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Su ...

  5. Problem E. Matrix from Arrays(杭电2018年多校第四场+思维+打表找循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6336 题目: 题意:给你一个l个元素的数组a,用题目中的程序构造一个新的矩阵,询问q次,问以(x1,y ...

  6. 杭电oj 1016 Prime Ring Problem

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. hdu6373 Pinball 杭电第六场 物理知识

    Pinball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  8. 杭电第六场 hdu6362 oval-and-rectangle 积分求期望

    oval-and-rectangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. hdu6354 杭电第五场 Everything Has Changed 计算几何

    Everything Has Changed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java ...

随机推荐

  1. 解决微信小程序开发者工具输入框焦点问题

    Windows10笔记本上运行微信小程序开发者工具,输入框(input,textarea)没有焦点,只能在真机调试,效率太低.后来发现是Window10对笔记本高分屏支持不好,要DPI缩放,导致兼容性 ...

  2. web渗透---第二天

    协议常识 HTTP协议 百度百科的解释:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. 所有的WWW文件都必须遵守这个标准. ...

  3. S2:c#继承

    在C#中,如果一个类后面通过冒号又跟了另外一个类,那么我们就称冒号前面的类为子类,冒号后面的类为父类.这种书写类的方式放映出来的关系就称为类的继承关系. 1.子类:派生类 父类:基类或者超类 满足is ...

  4. Hadoop 系列(四)—— Hadoop 开发环境搭建

    一.前置条件 Hadoop 的运行依赖 JDK,需要预先安装,安装步骤见: Linux 下 JDK 的安装 二.配置免密登录 Hadoop 组件之间需要基于 SSH 进行通讯. 2.1 配置映射 配置 ...

  5. js中判断一个对象的类型的种种方法

    javascript中检测对象的类型的运算符有:typeof.constructor.instanceof. typeof:typeof是一个一元运算符,返回结果是一个说明运算数类型的字符串.如:&q ...

  6. 微信小程序的视图与渲染

    1.组件的基本使用 <button type="default" > default </button> <button type="pri ...

  7. Python 之父的解析器系列之三:生成一个 PEG 解析器

    原题 | Generating a PEG Parser 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众号作者) 声明 ...

  8. vue面试题整理vuejs基础知识整理

    初级参考 1.v-show 与 v-if 区别 v-show 是css隐藏,v-if是直接销毁和创建,所以频繁切换的适合用v-show 2.计算属性和 watch 的区别 计算属性是自动监听依赖值的变 ...

  9. 从MySQL迁移到MariaDB(CentOS)

    MySQL是世界上最流行的开源关系数据库.原来 MariaDB 的设计初衷之一就是完全兼容 MySQL,包括 API 和客户端协议,使之能轻松成为 MySQL 的代替品.MariaDB 与 MySQL ...

  10. 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法

    面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...