杭电2018多校第四场(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -子矩阵求和-规律+二维前缀和

6336.Problem E. Matrix from Arrays

不想解释了,直接官方题解:

队友写了博客,我是水的他的代码

------>HDU 6336 子矩阵求和

至于为什么是4倍的,因为这个矩阵是左上半边有数,所以开4倍才能保证求的矩阵区域里面有数,就是图上的红色阴影部分,蓝色为待求解矩阵。

其他的就是容斥原理用一下,其他的就没什么了。

代码:

 1 //1005-6336-矩阵求和-二维前缀和+容斥-预处理O(1)查询输出
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<bitset>
 7 #include<cassert>
 8 #include<cctype>
 9 #include<cmath>
10 #include<cstdlib>
11 #include<ctime>
12 #include<deque>
13 #include<iomanip>
14 #include<list>
15 #include<map>
16 #include<queue>
17 #include<set>
18 #include<stack>
19 #include<vector>
20 using namespace std;
21 typedef long long ll;
22
23 const double PI=acos(-1.0);
24 const double eps=1e-6;
25 const ll mod=1e9+7;
26 const int inf=0x3f3f3f3f;
27 const int maxn=100+10;
28 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
29
30 ll n,a[maxn],sum[maxn][maxn];
31
32 void init()
33 {
34     int cnt=0;
35     for(int i=0;i<4*n;++i){
36         for(int j=0;j<=i;++j){
37             sum[j][i-j]=a[cnt];
38             cnt=(cnt+1)%n;
39         }
40     }
41     for(int i=0;i<2*n;i++){
42         for(int j=0;j<2*n;j++){
43             if(i> 0&&j> 0) sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
44             if(i==0&&j> 0) sum[i][j]+=sum[i][j-1];
45             if(i> 0&&j==0) sum[i][j]+=sum[i-1][j];
46         }
47     }
48 }
49
50 ll GetAns(int x,int y)
51 {
52     ll ans=0;
53     ans+=(x/n)*(y/n)*sum[n-1][n-1];
54     ans+=(y/n)*sum[x%n][n-1];
55     ans+=(x/n)*sum[n-1][y%n];
56     ans+=sum[x%n][y%n];
57     return ans;
58 }
59
60 int main()
61 {
62     int t;scanf("%d",&t);
63     while(t--){
64         scanf("%lld",&n);
65         for(int i=0;i<n;i++)
66             scanf("%lld",&a[i]);
67         init();
68         n=n*2;
69         int m;scanf("%d",&m);
70         for(int i=0;i<m;i++){
71             int x1,y1,x2,y2;
72             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
73             ll ans=GetAns(x2,y2)-GetAns(x1-1,y2)-GetAns(x2,y1-1)+GetAns(x1-1,y1-1);//容斥
74             printf("%lld\n",ans);
75         }
76     }
77 }

溜了。

原文地址:https://www.cnblogs.com/ZERO-/p/9463986.html

时间: 2024-10-10 01:44:46

杭电2018多校第四场(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -子矩阵求和-规律+二维前缀和的相关文章

杭电2018多校第四场(2018 Multi-University Training Contest 4) 1004.Problem D. Nothing is Impossible (HDU6335) -思维题

6335.Problem D. Nothing is Impossible 题意:给你n道题目,m个人,每题有x个正确选项,y个错误选项,问你做对题数量最多的人做对了多少道题目. 如果一道题有y个错误选项,那么我需要至少y+1个人才能保证一定有一个人做对了这道题目,所以题面上给的正确选项的数量x并没有什么实质性的作用... 假设第一题错误选项有y1个,第二题错误选项有y2个,那么怎么才能保证至少有一个人两道题目都做对了呢? 首先我需要至少y1+1个人才能保证一定有一个人做对了第一题,那么,我在做

[hdu 4899]14年多校第四场C Hero meet devil 状压DP

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 122    Accepted Submission(s): 49 Problem Description There is an old country and the king fell in love with a devil. The devil always asks th

2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)

题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位与的值相同,问能找出多少符合要求的组合. 思路 :比赛的时候有点没有头绪,后来二师兄想出了状态转移方程,YN又改了很多细节,最后才A的.总之是个别扭的DP..... 一开始是 _xor[i][j^a[i]] += _xor[i-1][j] :j 的下一个状态 就是异或上a[i],这个数组所代表的意思

多校第四场

P1006:真不会线段树,更不会带LAZY的线段树. 思想就是延迟标记 #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<iostream> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define N 111

2019湖南多校第四场

解题过程 开场lfw过A,然后shl过C,然后把B题丢给做苦力劳动悲悲伤伤的lfw写,lfw过B,D题lfw开始字符串hash,一开始直接用结构体里面存数组丢set里面然后MLE,之后改成long long丢进set,还是MLE,然后lfw开始上头,随便乱改一下就交上去MLE. 然后shl吧防AK题K过了,做过这套题的原题,接下来shl还是死磕I题,一直在WA.lfw修改了D题复杂度,WA了一发,改成双关键字就过了.最后 set只能存1e6,超过就会mle.shl把G题过掉,和byf一起死磕I题

2019 杭电多校 第四场

2019 Multi-University Training Contest 4 补题链接:2019 Multi-University Training Contest 4 1001 AND Minimum Spanning Tree (HDU 6614) 题意 给定一个有 \(N\) 个结点的完全图,编号从 \(1\) 到 \(N\).结点 \(x\) 与结点 \(y\) \((1\leq x, y\leq N, x \neq y)\) 的边的权值为 \(x\) 与 \(y\) 按位与的值,求

Problem E. Matrix from Arrays(杭电2018年多校第四场+思维+打表找循环节)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6336 题目: 题意:给你一个l个元素的数组a,用题目中的程序构造一个新的矩阵,询问q次,问以(x1,y1)为左上角,(x2,y2)为右下角的矩阵内的元素之和(原点在左上角). 思路:我们通过打表可以发现这个大矩阵都是以左上角2l*2l的小矩阵M循环出现的,所以对于每次查询我们只需统计他要查询的矩阵包含多少个完整的M,对于那些不构成完整的行列和,我们首先用前缀和统计出来,最后加起来即可.我的方法用下图

2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)

K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明这个范围内存在第k小的数,r=mid,否则不存在,l=mid+1. 代码如下 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; inline int read(){

暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第五场)

开启疯狂水题解模式,大概会持续好几次...直到我赶上进度为止. 以下题解包括: \[1001[HDU-6624] \\ 1004[HDU-6627] \\ 1005[HDU-6628] \\ 1006[HDU-6629] \\ 1007[HDU-6630]\] [1001] 数学 HDU-6624 fraction http://acm.hdu.edu.cn/showproblem.php?pid=6624 找到最小正整数的 \(b\) 满足 \(a<b\) 且 \(a = bx(mod \ p