杭电多校第四场 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)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
随机推荐
- 我们一起学习WCF 第六篇文件传输
原文 http://www.cnblogs.com/LipeiNet/p/4653830.html 前言:文件的输出我们并不陌生,但是今天我写的是用wcf模式进行文件传输,我觉得一大好处就是能进 ...
- react中创建组件
第1种 - 创建组件的方式 > 使用构造函数来创建组件,如果要接收外界传递的数据,需要在 构造函数的参数列表中使用`props`来接收:> 必须要向外return一个合法的JSX创建的虚拟 ...
- 惊世骇俗的sql语句之连表查询
select `product_skus`.id as skuId, `wname` as sku名称, if(`sku_attributes`.`status`=1,'上架','下架') as 状态 ...
- 牛客练习赛24-B-贪心
链接:https://www.nowcoder.com/acm/contest/157/B来源:牛客网 题目描述 凤凰于飞,翙翙其羽,亦集爰止. ...
- IDEA 错误:找不到或无法加载主类
下的java核心编程的源码,只有java文件,没有idea或者eclipse的项目结构信息. 分别用eclipse和idea打开了一遍,方便学习调试. 项目文件夹:E:\学习资料\Java\语法\ja ...
- Shelld5的使用
Shelld的连接7步 · · huhu_k: 想和你相遇.
- 微服务之SpringCloud基础
SpringCloud微服务基础 微服务架构--SpringCloud网站架构模式 单点应用/分布式系统面向于服务架构(SOA) /微服务架构web项目三层架构1.控制层2.业务逻辑层3.数据访问层传 ...
- linux 程序实现后台运行
先上代码: getopt函数获取参数 -d 控制台控制运行 -D 后天运行 -h 调用show_help函数. 编译命令 gcc -g -W test.c -o test 注意后台运行 ./te ...
- 原 spring-boot工程中,jpa下hibernate的ddl-auto的各种属性
jpa: hibernate: ddl-auto: create ddl-auto:create----每次运行该程序,没有表格会新建表格,表内有数据会清空 ddl-auto:create-d ...
- linux下crontab的原理和用法
linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...