杭电多校第四场 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)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
随机推荐
- WARNING: CPU: 0 PID: 1 at ./arch/x86/include/asm/fpu/internal.h:373
------------[ cut here ]------------WARNING: CPU: 0 PID: 1 at ./arch/x86/include/asm/fpu/internal.h: ...
- LOJ6072苹果树
虽然结合了很多算法,但是一步一步地推一下还不算太难的一道题. 首先考虑枚举枚举有用的苹果的集合,然后去算生成树个数. 先考虑怎么计算生成树个数. 发现可以使用matrix-tree. 所有有用点可以和 ...
- 深入解析 composer 的自动加载原理 (转)
深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...
- vue核心之虚拟DOM
一.前言 虚拟DOM概念随着react的诞生而诞生,由facebook提出,其卓越的性能很快得到广大开发者的认可:继react之后vue2.0也在其核心引入了虚拟DOM的概念,本文将以vue2.0使用 ...
- ERROR: java.lang.NullPointerException的一种情况
java.lang.NullPointerException错误,错误原因就是以下六条没配置完: 1.JAVA环境配置正确.2.源码里面的包没有与tomcat的包冲突.3.把数据库文件给导入到了SQL ...
- hbase知识
HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统 HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据. HBASE ...
- Leetcode 980. 不同路径 III
980. 不同路径 III 显示英文描述 我的提交返回竞赛 用户通过次数42 用户尝试次数43 通过次数46 提交次数60 题目难度Hard 在二维网格 grid 上,有 4 种类型的方格: 1 ...
- 【数据库】SQL语句
SQL 分为两个部分:数据操作语言(DML)和 数据定义语言(DDL).增删改查(CRUD)构成了 SQL 的 DML 部分. SELECT - 从数据库表中获取数据 SELECT 列名 FROM 表 ...
- [vjudge contest15(xjoi)] C - Berzerk
CodeForces - 787C Rick and Morty are playing their own version of Berzerk (which has nothing in comm ...
- 关于jsp页面的一些知识(一)
1,<%@ include file=” ”%> ——最简洁易懂的解释 http://blog.csdn.net/little_stars/article/details/17373477 ...