B题3051-3099

B3612【深进1.例1】求区间和

题目描述

给定 $n$ 个正整数组成的数列 $a_1, a_2, \cdots, a_n$ 和 $m$ 个区间 $[l_i,r_i]$,分别求这 $m$ 个区间的区间和。

输入格式

第一行,为一个正整数 $n$ 。

第二行,为 $n$ 个正整数 $a_1,a_2, \cdots ,a_n$

第三行,为一个正整数 $m$ 。

接下来 $m$ 行,每行为两个正整数 $l_i,r_i$ ,满足 $1\le l_i\le r_i\le n$

输出格式

共 $m$ 行。

第 $i$ 行为第 $i$ 组答案的询问。

样例 #1

样例输入 #1

4
4 3 2 1
2
1 4
2 3

样例输出 #1

10
5

提示

样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为 5。

对于 $50%$ 的数据:$n,m\le 1000$ ;

对于 $100%$ 的数据:$1 \leq n,m\le 10^5$,$1 \leq a_i\le 10^4$。

#include <iostream>
#include <ios>
#include <vector>
using namespace std;
using ll = long long;
const int N = 1e5 + 100;
ll arr[N];
ll prefix[N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n;
for (int i = 1; i <= n; ++i)cin >> arr[i];
//预处理前缀和
for (int i = 1; i <= n; ++i)prefix[i] = prefix[i - 1] + arr[i];
int q; cin >> q;
while (q--)
{
int l, r;
cin >> l>>r;
//直接计算区间的和
cout << prefix[r] - prefix[l - 1] << '\n';
}
}

B3693 数列前缀和 4

题目背景

这次不是数列的问题了。

题目描述

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

$$(\sum_{i = u}^x \sum_{j = v}^y a_{i,j}) \bmod 2^{64}$$

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

输入格式

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

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

第一行三个整数,依次表示矩阵的行数 $n$ 和列数 $m$ 以及询问数 $q$。
接下来 $n$ 行,每行 $m$ 个整数。第 $i$ 行第 $j$ 个整数表示 $a_{i,j}$。
接下来 $q$ 行,每行四个整数,依次为 $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$。其按位异或和为 $52$。

数据规模与约定

对全部的测试点,保证 $1 \leq T \leq 10$,$1 \leq n, m \leq 10^3$,$1 \leq q \leq 10^6$,$0 \leq a_i < 2^{64}$,$1 \leq u \leq x \leq n$,$1 \leq v \leq y \leq m$。

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

提示

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

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_1 \sim a_n$ 的按位异或和,则调用 getXorSum(a + 1, a + 1 + n),求 $a_0 \sim a_{n - 1}$ 的按位异或和,则调用 getXorSum(a, a + n)。如果 $a$ 是 std::vector,则将上述调用代码里的 a 均改为 a.begin() 即可。

#include <iostream>
#include <ios>
#include <vector>
using namespace std;
using ll = unsigned long long;
const ll N = 1e3 + 200;
const ll M = 1e3 + 200;
ll a[N][M];
ll prefix[N][M];
int T, n, m, q;
int u, v, x, y;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> T;
while (T--)
{
cin >> n >> m >> q;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cin >> a[i][j];
}
}
//求二维前缀和
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
prefix[i][j] = prefix[i - 1][j] + prefix[i][j - 1] - prefix[i - 1][j - 1] + a[i][j];
}
}
ll tmp,ret=0;
while (q--)
{
//求指定区域的和
cin >> u >> v >> x >> y;
tmp = prefix[x][y] - prefix[x][v - 1] - prefix[u - 1][y] + prefix[u - 1][v - 1];
ret ^= tmp;
}
cout << ret << '\n';
}
return 0;
}
posted @   coreSoul  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示