C++
$\color{#cc33ff}{— > 算法基础课题解}$
$\color{gold}{— > 蓝桥杯辅导课题解}$
思路:
前缀和(思想):
$\color{red}{快速}$$求出一个静态数组(中间不会修改的)的某一个区间内所有数的和$
$\color{blue}{模板}$
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
$图解:$
$code1:$
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int a[N], s[N];
int main(){
//ios::sync_with_stdio(false);
//原理:让cin和标准输入输出不同步 作用:提高cin的读取速率(但还是没有scanf快) 副作用:不能在使用scanf了
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;
}
$code2:$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int a[N], s[N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
s[i] = s[i - 1] + a[i]; // 前缀和
}
while (m --) {
int l, r; cin >> l >> r;
cout << s[r] - s[l - 1] << endl;
}
return 0;
}
用cin/cout输入输出的时间:
用scanf/printf输入输出的时间:
建议:数据量大(大于等于$10^5$)的情况下用scanf/printf输入输出,(虽然写cin/cout可以少些几个字母)会快很多
牛牛
orz