前缀和
795.前缀和
输入一个长度为 nn 的整数序列。
接下来再输入 mm 个询问,每个询问输入一对 l,rl,r。
对于每个询问,输出原序列中从第 ll 个数到第 rr 个数的和。
输入格式
第一行包含两个整数 nn 和 mm。
第二行包含 nn 个整数,表示整数数列。
接下来 mm 行,每行包含两个整数 ll 和 rr,表示一个询问的区间范围。
输出格式
共 mm 行,每行输出一个询问的结果。
数据范围
1≤l≤r≤n1≤l≤r≤n,
1≤n,m≤1000001≤n,m≤100000,
−1000≤数列中元素的值≤1000−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
解答
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int a[N], s[N];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i]; // 前缀和的初始化
while (m -- )
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", s[r] - s[l - 1]); // 区间和的计算
}
return 0;
}
4789.前缀和序列
给定一个长度为 nn 的正整数序列 a1,a2,…,ana1,a2,…,an。
如果将该序列从小到大排序,则可以得到另一个长度为 nn 的正整数序列 b1,b2,…,bnb1,b2,…,bn。
现在,请你回答 mm 个询问,询问共分为以下两种:
1 l r
,请你计算并输出 ∑i=lrai∑i=lrai。2 l r
,请你计算并输出 ∑i=lrbi∑i=lrbi。
输入格式
第一行包含整数 nn。
第二行包含 nn 个正整数 a1,a2,…,ana1,a2,…,an。
第三行包含整数 mm。
接下来 mm 行,每行包含一个询问,格式如题面描述。
输出格式
共 mm 行,每个询问输出一行答案。
数据范围
前 33 个测试点满足 1≤n,m≤101≤n,m≤10。
所有测试点满足 1≤n,m≤1051≤n,m≤105,1≤ai≤1091≤ai≤109,1≤l≤r≤n1≤l≤r≤n。
输入样例1:
6
6 4 2 7 2 7
3
2 3 6
1 3 4
1 1 6
输出样例1:
24
9
28
输入样例2:
4
5 5 2 3
10
1 2 4
2 1 4
1 1 1
2 1 4
2 1 2
1 1 1
1 3 3
1 1 3
1 4 4
1 2 2
输出样例2:
10
15
5
15
5
5
2
12
3
5
输入样例3:
4
2 2 3 6
9
2 2 3
1 1 3
2 2 3
2 2 3
2 2 2
1 1 3
1 1 3
2 1 4
1 1 2
输出样例3:
5
7
5
5
2
7
7
13
4
解答
自己写的
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,a[N],b[N],m;
long long s[N],d[N];
int l,r;
int o;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i], b[i] = a[i];
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
d[i]=d[i-1]+b[i];
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>o>>l>>r;
if(o==1){
cout<<s[r]-s[l-1]<<endl;
}
else{
cout<<d[r]-d[l-1]<<endl;
}
}
return 0;
}
心得
1.s[N],d[N]用long long 是因为题目数据范围过大,以后也要注意。
2.
sort(b + 1, b + n + 1)
这个用法表示对数组 b
中从 b[1]
到 b[n]
的范围进行排序。
b + 1
:指向数组b
中的第一个元素b[1]
的指针。b + n + 1
:指向数组b
的第n+1
个位置的指针(但该位置不属于数组有效范围,仅作为结束标记)。
C++ 的 sort
函数的签名如下:
template <class RandomIt>
void sort(RandomIt first, RandomIt last);
first
表示排序的开始位置,last
表示排序的结束位置,但 last
是不参与排序的元素,即排序范围是 [first, last)
,包含 first
不包含 last
。
因此,sort(b + 1, b + n + 1)
实际上排序的是从 b[1]
到 b[n]
的元素。
未完待续