标签:HDU 21 42 ll 容斥 6336 include 方阵 define
通过观察可以发现,假设给的数组长度为l,如果l为奇数,那么ll的矩阵周期性出现,如果l为偶数,那么2l2l的方阵周期性出现,所以我们可以把2l * 2l的方阵存起来,然后写一个函数f,这个函数接受一个点,返回这个点与0,0点所代表的方阵中所有子元素的和,接下来只要运用容斥关系,把四个点扔进这个函数求值即可。
#include <iostream>
#include <math.h>
#include <iomanip>
#include <string>
#include <cstdio>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
#define N 17
#define M 998244353
#define ll long long
using namespace std;
ll A[10];
ll map[42][42];
ll t,l,q;
ll cnt;
ll pre[21][21];
ll g[21];
ll sum(ll x,ll y){
if(x == 0 || y == 0){
return 0;
}
for(int i=1;i<=2*l;i++){
g[i] = g[i-1] + pre[i][2*l] * (y/(2*l)) + pre[i][y%(2*l)];
}
return g[2*l] * (x/(2*l)) + g[x%(2*l)];
}
int main() {
ll i,j;
scanf("%lld",&t);
while (t > 0)
{
t--;
ll x1,y1,x2,y2;
scanf("%lld",&l);
for(i=0;i<l;i++){
scanf("%lld",&A[i]);//从0开始
}
cnt = -1;
for(i = 1;i<= 4*l;i++){
for(j=1;j<=i;j++){
cnt = (cnt+1)%l;
map[j][i+1-j] = A[cnt];
}
}
for(i=1;i<=2*l;i++){
for(j=1;j<=2*l;j++){
pre[i][j] = pre[i][j-1] + map[i][j];
}
}
scanf("%lld",&q);
for(i=1;i<=q;i++){
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
//cout<<sum(x1-1,y1-1)<<endl;
//cout<<sum(x2,y2)<<endl;
y1++,x1++,y2++,x2++;
ll ans = sum(x1-1,y1-1) + sum(x2,y2) - sum(x2,y1-1) - sum(x1-1,y2);
printf("%lld\n",ans);
}
}
return 0;
}
标签:HDU,21,42,ll,容斥,6336,include,方阵,define 来源: https://blog.csdn.net/qq_19275839/article/details/98883584
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。