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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)