HDU 6336 子矩阵求和

Wesley13
• 阅读 721

Problem E. Matrix from Arrays

**Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1162    Accepted Submission(s): 522
**

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

2018 Multi-University Training Contest 4

解析   矩阵是无限大的所以右下角没有被赋值的地方是不受影响的QAQ   长度为偶数循环矩阵是 2L*2L  所以直接按照2L算就是了  二位前缀和预处理一下  数一下完事了   

AC代码

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" ";
using namespace std;
typedef long long ll;
const ll maxn=1e2+10,inf=0x3f3f3f3f;
const ll mod=1e9+7;
ll a[maxn],g[maxn][maxn],n;
ll sum[maxn][maxn];
void init()
{
    int cnt=0;
    for(int i=0;i<4*n;++i)
    {
        for(int j=0;j<=i;++j) 
        {
            g[j][i-j]=a[cnt];
            cnt=(cnt+1)%n;
        }
        
    }
    sum[0][0]=g[0][0];
    for(int i=0;i<2*n;i++)
    {
        for(int j=0;j<2*n;j++)
        {
            if(i>0&&j>0)sum[i][j]=g[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
            if(i==0&&j>0)sum[i][j]=g[i][j]+sum[i][j-1];
            if(j==0&&i>0)sum[i][j]=g[i][j]+sum[i-1][j];
        }
    }
}
ll solve(int x,int y)
{
    ll ans=0;
    ll xx=x/n;
    ll yy=y/n;
    ll yux=x%n;
    ll yuy=y%n;
    ans+=xx*yy*sum[n-1][n-1];
    ans+=yy*sum[yux][n-1];
    ans+=xx*sum[n-1][yuy];
    ans+=sum[yux][yuy];
    return ans;
}
int main()
{
    int t,q;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        init();n=n*2;
        cin>>q;
        while(q--)
        {
            int x1,x2,y1,y2;
            cin>>x1>>y1>>x2>>y2;
            //cout<<solve(x1,y1)<<endl;
            cout<<solve(x2,y2)-solve(x1-1,y2)-solve(x2,y1-1)+solve(x1-1,y1-1)<<endl;
        }
    }
    return 0;
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
桃浪十七丶 桃浪十七丶
3年前
输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数。
题目内容:输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数。例:(1)输入:Ilovehebeu!输出:character:10,space:2,digit:0,others:1(2)输入:2020,haveabrilliantyear!输出:character:18,space:4,digit:4,others:2答案:c
Easter79 Easter79
3年前
Typescript 常见的几种函数重载方法详解与应用示例
所谓的重载,其实就是使用相同的函数名,传入不同数量的参数或不同类型的参数,以此创建出多个方法或产生不同结果。1\.最常见的,也就是根据定义傻瓜式地判断参数类型与数量functionshowPerson(name,...others){console.log(name,others)}
Stella981 Stella981
3年前
HDOJ1518Square 深搜
SquareTimeLimit:10000/5000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):11099AcceptedSubmission(s):3566ProblemDescriptionGivena
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
HDOJ 1237题 简单计算器
简单计算器TimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):15220AcceptedSubmission(s):5195ProblemDescription读入一个只包含,
Wesley13 Wesley13
3年前
ACM_括号匹配
括号匹配(栈)TimeLimit:2000/1000ms(Java/Others)ProblemDescription:给一组包含()两种括号的序列,检查是否是合法的。如:(),(
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了