杭电多校第四场 E Matrix from Arrays
Problem E. Matrix from Arrays
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 474 Accepted Submission(s): 202
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).
我们可以发现它是有矩阵周期的,把偶数和奇数的情况都打一遍,发现奇数的时候是以n为一个周期,偶数是2*n
那既然后面的都是相同的,那么我们就没必要构造出来,a数组最大长度是10,所以我们循环矩阵最大是20*20,我们只要把
循环矩阵计算出来即可,后面的相同的不再重复计算,当我们输入一个区间的时候,我们只要算边界和里面循环矩阵的个数即可
这里我们再用到一个二维前缀和来优化我们的时间
b[i][j] 代表i行j列的矩阵的和
二维前缀和这里就不再讲述,我说下怎么由我们的循环矩阵的前缀和延伸到总的大矩阵的前缀和
我们要计算 x y的矩阵前缀和,我们只知道循环矩阵,那我们现在来计算
‘我们3*3的循环矩阵,我们要求5*5的前缀和
我们首先计算出里面包括了多少个循环矩阵
b[n-1][n-1]*(x/n)*(y/n)
b[n-1][n-1]是我们的循环矩阵和,(x/n)代表我的行区间有多少个,(y/n)代表列区间有多少个,乘起来就是总共的了 然后我们计算循环矩阵后,我们要来计算多余的边界
但是他是循环矩阵,所以我们只要进行取模n就能把坐标映射到循环矩阵上
所以行和列都是同理,都还要分别乘以(x/n)和(y/n)
而我们还剩下一个对角,对角可以直接计算,不用除,
看下图

详细解释看代码
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll a[];
ll b[][];
int n,m;
ll cal(int x,int y)
{
if(x<||y<) return ;
return b[n-][n-]*(x/n)*(y/n)+b[x%n][n-]*(y/n)+b[n-][y%n]*(x/n)+b[x%n][y%n];//计算循环矩阵的个数 列的多余边界 行的多余边界 对角的多余边界
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%lld",&a[i]);
int cursor = ;
for (int i = ; i<=; ++i) {//填充我们的矩阵
for (int j = ; j <= i; ++j) {
b[j][i - j] = a[cursor];
cursor = (cursor + ) % n;
}
}
n=*n;
for(int i=;i<n;i++)//计算循环矩阵的二维前缀和
{
for(int j=;j<n;j++)
{
if(i) b[i][j]+=b[i-][j];
if(j) b[i][j]+=b[i][j-];
if(i&&j) b[i][j]-=b[i-][j-];
}
}
int x1,x2,y1,y2;
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%lld\n",cal(x2,y2)-cal(x2,y1-)-cal(x1-,y2)+cal(x1-,y1-));//二维前缀和的计算方法(用前缀大矩阵分别减去行列矩阵,但是行列中间重复了一个小矩阵,需要再加上)
}
}
}
杭电多校第四场 E Matrix from Arrays的更多相关文章
- 杭电多校第四场 Problem K. Expression in Memories 思维模拟
Problem K. Expression in Memories Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262 ...
- [2019杭电多校第四场][hdu6623]Minimal Power of Prime
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6623 题目大意为求一个数的唯一分解的最小幂次.即120=23*31*51则答案为1. 因为数字太大不能 ...
- [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6621 题意为求区间[l,r]内第k小|a[i]-p|的值. 可以二分答案,如果二分的值为x,则判断区间 ...
- [2019杭电多校第四场][hdu6616]Divide the Stones
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6616 题意是说n个数分别为1-n,将n个数分成k堆,能否满足每堆个数相等,数值之和相等.保证n%k=0 ...
- [2019杭电多校第四场][hdu6614]AND Minimum Spanning Tree(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6614 题目大意是有一张n个点的完全图,n个点点权为1-n,边权为两点点权按位与(&).求最小生 ...
- 2019杭电多校第四场hdu6623 Minimal Power of Prime
Minimal Power of Prime 题目传送门 解题思路 先打\(N^\frac{1}{5}\)内的素数表,对于每一个n,先分解\(N^\frac{1}{5}\)范围内的素数,分解完后n变为 ...
- 杭电多校第四场-H- K-th Closest Distance
题目描述 You have an array: a1, a2, , an and you must answer for some queries.For each query, you are g ...
- 2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)
K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明 ...
- 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
随机推荐
- Winform开发框架之框架演化
Winform开发框架方面的文章我介绍很多了,有宏观介绍,也有部分技术细节的交流,每次我希望能从不同角度,不同方面来介绍我的WInform开发框架,这些其实都是来源于客户的需求,真实的项目场景.本文主 ...
- android-------- 多渠道打包(借助友盟移动统计分析)
好久没有发博客了,原因是换工作了,今天端午假期,所以来发一篇博客, 多渠道打包,借助友盟移动统计分析,希望对各位有所帮助 多渠道打包的理解: 渠道包就是要在安装包中添加渠道信息,也就是channel, ...
- apiCloud 版本号
应用版本号:this.appVersion = api.appVersion; 更新系版本的时候可用来比较
- php算法,冒泡排序
冒泡排序 /*** *从小到大排列 * 逻辑分析 假设数组 $arr=[a,b,c,d]; * 总数=4; * 比较对象 第几个元素 比较次数 * a 1 3 * b 2 2 * c 3 1 **/ ...
- Oracle11g温习-第十九章:审计(audit)
2013年4月27日 星期六 10:52 1.审计的功能:监控用户在database 的 action (操作) 2.审计分类 1) session :在同一个session,相同的语句只产生一个审计 ...
- laravel请求到响应的生命周期
请求到响应的核个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段.请求实例化阶段.请求处理阶段.响应发送和程序终止阶段. public\index.php中有这么一段代码 $app = requi ...
- Hadoop介绍-4.Hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker
Hadoop是一个能够对大量数据进行分布式处理的软体框架,实现了Google的MapReduce编程模型和框架,能够把应用程式分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行.在MapR ...
- Nodejs--util模块
util.inspect util.inspect是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出. 它至少接受一个参数 object,即要转换的对象. util.inspect(obje ...
- ActiveMQ 的连接和会话
要了解 connection 和 session 的概念,可以先从 ConnectionState 和 SessionState 入手: // 省略部分代码 public class Connecti ...
- eclipse安装springboot插件
1.工具栏->Help->Eclise Marketplace打开应用市场 2.在应用市场中搜索sts,选择Spring Tools 4紧张安装 3.按提示进行安装