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. 戴尔PowerEdge T110 Ⅱ服务器U盘安装Windows Server 2019 DataCenter

    一. 下载准备 准备工作——下载Microsoft Windows Server 2019 官方简体中文激活版 (MSDN)原版iso镜像 准备工作——安装刻录软件UltraISO,单文件绿色版就够用 ...

  2. 从js 讲解时间复杂度和空间复杂度

    1. 博客背景 今天有同事在检查代码的时候,由于函数写的性能不是很好,被打回去重构了,细思极恐,今天和大家分享一篇用js讲解的时间复杂度和空间复杂度的博客 2. 复杂度的表示方式 之前有看过的,你可能 ...

  3. 最基础的 ant build 脚本

    最基础的 ant build 脚本,根据项目,自行进行修改 <?xml version="1.0" encoding="UTF-8" ?> < ...

  4. virtualbox安装ubuntu16 LTS及其配置

    一.下载安装VirtualBox 1. 从官网下载VirtualBox,目前版本:VirtualBox 6.0.6 for Windows hosts x86/amd64 2. 下载好之后安装Virt ...

  5. Draw.io

    如何给类图增加一个字段? 选中一个字段,然后按 Ctrl +Enter 即可. 参考:Add row to class diagram - stackoverflow

  6. 关于p标签不能嵌套div标签引发的标签嵌套问题总结

    问题由来:<p>中嵌套<div>标签,两个都是块级元素,按理应该可以正常显示,但是最后的结果居然是多出来一段<p>的效果,所以就在网上找了许多关于标签嵌套规则的资料 ...

  7. h5微信浏览器复制粘贴--ios兼容问题的解决方法(clipboard.js插件)

    前段时间在做微信h5的时候,遇到了ios兼容,使用clipboard.js插件完美解决 下载地址:下载地址: https://github.com/zenorocha/clipboard.js cnd ...

  8. 如何在GitHub上删除自己的项目?

    话不多说,直奔主题~ 1.打开GitHub,在主页左边有自己写的库. 2.拿删除第二个库wlh-hub/vue-zsgc为例,点击它,进入下面页面. 3.在导航栏一栏中,找到settings,并点击. ...

  9. 记一次 Windows MySQL 恢复

    0x00 事件 因为本地的服务器硬件出现故障,导致一台 Windows 系统的开发环境挂了,且无法短时间内恢复状态. 应急方案是使用了云上的系统重建了开发环境. 开发人员说需要挂了的那台 Window ...

  10. 微信小程序项目总结-记账小程序(包括后端)

    一.小程序部分 这是理财系统的前端,江苏海洋大学微信小程序比赛,最后获得了一等奖 GitHub:https://github.com/GeorgeLeoo/finance 1. 项目描述 (1). 此 ...