首页 > 编程语言 >打卡信奥刷题(382)用C++信奥B3693[普及组/提高] 数列前缀和 4

打卡信奥刷题(382)用C++信奥B3693[普及组/提高] 数列前缀和 4

时间:2024-12-08 14:30:17浏览次数:6  
标签:10 信奥 int sum C++ leq 异或 按位 打卡

数列前缀和 4

题目背景

这次不是数列的问题了。

题目描述

给定一个 n n n 行 m m m 列的矩阵 a a a,有 q q q 次询问,每次给定 ( u , v ) (u, v) (u,v) 和 ( x , y ) (x, y) (x,y),请你求出:

( ∑ i = u x ∑ j = v y a i , j )   m o d   2 64 (\sum_{i = u}^x \sum_{j = v}^y a_{i,j}) \bmod 2^{64} (i=u∑x​j=v∑y​ai,j​)mod264

也就是求出以 ( u , v ) (u, v) (u,v) 为左上角、 ( x , y ) (x,y) (x,y) 为右下角的矩形元素和对 2 64 2^{64} 264 取余数的结果。

输入格式

本题单测试点内有多组测试数据

输入的第一行是一个整数 T T T,表示数据组数。接下来依次给出每组数据的输入信息:

第一行三个整数,依次表示矩阵的行数 n n n 和列数 m m m 以及询问数 q q q。
接下来 n n n 行,每行 m m m 个整数。第 i i i 行第 j j j 个整数表示 a i , j a_{i,j} ai,j​。
接下来 q q q 行,每行四个整数,依次为 u , v , x , y u,v,x, y u,v,x,y,表示一组询问。

输出格式

为了避免输出过大,对于每组数据,请输出一行一个整数,表示本组数据的所有询问的答案的按位异或和。

样例 #1

样例输入 #1

2
3 3 3
1 2 3
4 5 6
7 8 9
1 1 3 3
2 1 2 2
1 2 2 3
2 2 1
1 3
4 6
2 2 2 2

样例输出 #1

52
6

提示

样例 1 解释

对第一组数据,三次询问的答案依次为 45 , 9 , 16 45,9,16 45,9,16。其按位异或和为 52 52 52。

数据规模与约定

对全部的测试点,保证 1 ≤ T ≤ 10 1 \leq T \leq 10 1≤T≤10, 1 ≤ n , m ≤ 1 0 3 1 \leq n, m \leq 10^3 1≤n,m≤103, 1 ≤ q ≤ 1 0 6 1 \leq q \leq 10^6 1≤q≤106, 0 ≤ a i < 2 64 0 \leq a_i < 2^{64} 0≤ai​<264, 1 ≤ u ≤ x ≤ n 1 \leq u \leq x \leq n 1≤u≤x≤n, 1 ≤ v ≤ y ≤ m 1 \leq v \leq y \leq m 1≤v≤y≤m。

数据保证 ∑ ( n × m ) ≤ 1 0 6 \sum(n \times m) \leq 10^6 ∑(n×m)≤106, ∑ q ≤ 1 0 6 \sum q \leq 10^6 ∑q≤106。即输入矩阵的总大小和询问总数均不超过 1 0 6 10^6 106。

提示

如果你不知道什么是按位异或和,可以在你的代码里添加如下的函数:

template <class T>
T getXorSum(T *begin, T *end) {
  T ret = 0;
  for (T *it = begin; it != end; ++it) ret ^= *it;
  return ret;
}

这一函数的作用是计算传入数组(包括 std::vector)某一左闭右开区间的按位异或和,返回值类型与传入数组的类型相同,调用方法与 std::sort 类似,例如,要求数组 a a a 的 a 1 ∼ a n a_1 \sim a_n a1​∼an​ 的按位异或和,则调用 getXorSum(a + 1, a + 1 + n),求 a 0 ∼ a n − 1 a_0 \sim a_{n - 1} a0​∼an−1​ 的按位异或和,则调用 getXorSum(a, a + n)。如果 a a a 是 std::vector,则将上述调用代码里的 a 均改为 a.begin() 即可。

C++实现

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int sum[2050][2050],temp,n,m,q,ans;
int u,v,x,y;
signed main()
{
int t;
cin>>t;
while(t–)
{
ans=0;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>temp;
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+temp;
}
for(int i=1;i<=q;i++)
{
cin>>u>>v>>x>>y;
ans^=sum[x][y]+sum[u-1][v-1]-sum[u-1][y]-sum[x][v-1];
}
cout<<ans<<endl;
}
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

标签:10,信奥,int,sum,C++,leq,异或,按位,打卡
From: https://blog.csdn.net/rogeliu/article/details/144307871

相关文章

  • 【C++算法】33.位运算_判定字符是否唯一
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:面试题01.01.判定字符是否唯一题目描述:解法如果使用数据结构的话哈希表:一个一个字符扫描,不在哈希表里面的就放进去,在里面的就返回false。扫描完全部不重复就返回true。也可以优化一下,字母一共26......
  • 【C++算法】34.位运算_丢失的数字
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:268.丢失的数字题目描述:解法哈希表创建一个0~5的数组从前往后遍历一下,有的数字就在表里面标记一下,最后看一下哪些数字没有被标记过。高斯求和先求出应该有的和:(首项+末项)*项数÷2然后减去数组的和......
  • 关于c++的一个报错
    使用tstring构造函数,用到了VarBaseString的tostring,调用完,会导致局部对象指针为nullptr,目前在查原因classVarBaseString:publicVar{public:VarBaseString(std::stringstr=""){val=str;type="string";......
  • 斐波那契数列c++
    意大利数学家斐波那契(LeonardoFibonacci)是12、13世纪欧洲数学界的代表人物。他提出的“兔子问题”引起了后人的极大兴趣。“兔子问题”假定一对大兔子每一个月可以生一对小兔子,而小兔子出生后两个月就有繁殖能力,问从一对小兔子开始,n个月后能繁殖成多少对兔子?输入格式:首先......
  • c++实验五
    实验任务3:#pragmaonce#include<string>usingnamespacestd;classMachinePets{public:MachinePets(conststd::strings);virtualstringtalk()const=0;stringnickname;stringget_nickname()const{returnnickname;}};MachinePets::......
  • C++ 数组内存申请和释放、引用
    在C++中如何实现对数组内存的申请和释放呢?同样使用关键字new、delete,可见以下代码例子:#include<iostream>usingnamespacestd;int*getGapList(int*arr,intsize){   int*p=newint[size-1];//这里需要申请一个数组对应的内存,就可以返回去   for(inti......
  • c++初识------for的循环变量的使用
    上次,我们讲了for循环,今天我们讲循环变量。废话不多说,直接进入正题。for循环语句的循环变量不仅仅可以用来控制循环运行的次数,还可以参与各种运算。举几个例子:观察数列:2 4 6 8 10...,输出数列的前n项。思路:第1步:因为要输出前n项,所以考虑用for循环。第2步:显......
  • 力扣打卡8:最长上升子序列
    链接:300.最长递增子序列-力扣(LeetCode)本题我开始想到的是dp,复杂度为O(n^2),这也是很经典的解法。看到进阶解法可以O(nlogn),想到可能是要用到二分,但是,我想到的是和map排序,再二分查找第一个比当前值小的数,再找比它小的所有数,中维护max序列,再塞到map中,可惜严格来讲还是O(n^2)......
  • 算法刷题打卡DFS深度搜索
    DFS概要:    要想学会深度优先搜索的题目,首先需要知道他的代码原理,适用场景基本原理:    DFS是基于遍历,搜索树,图的算法,通过从根节点(或任意起始节点)开始,沿着每个分支深入访问节点,直到到达叶子节点或没有未访问的邻居节点为止,然后回溯到上一个节点,继续搜索其他......
  • 的士费用——c++加强选择结构
    呃上一章讲的是经典选择结构,这一章我们讲“加强版”的选择结构。所谓的“加强”,是在计算费用的基础上加上多余的钱数。我们来看道题:题目描述某市的士费起步价 8 元,可以行驶 3 公里。3 公里以后,按每公里 1.6 元计算,输入的士的公里数,请你计算顾客需付费多少元?输入格......