如果给出,我怎么可能得到数组中两个给定点之间的元素总和:
n - 数组长度
m - 关于数组的问题数
a [n] - 数组编号
m格式x y
的问题示例
输入
3 3
-1 2 0
3 3
1 3
1 2
输出
0
1
1
这是我的代码
#include <iostream>
#include <numeric>
using namespace std;
int main()
{
int n,m,x,y;
cin>>n>>m;
int a [n];
int s [m];
for (int i = 0; i < n; i++){
cin>>a[i];
}
for (int i = 0; i < m ; i++){
cin>>x>>y;
if(x == y){
s[i] = a[x-1];
continue;
}
s[i] = accumulate(a + x - 1, a + y,0);
}
for (int i = 0; i < m; i++){
cout<<s[i]<<endl;
}
return 0;
}
这不是学校的家庭作业,只是来自互联网的任务 - 它将使用Standard streams在测试服务器上运行以进行输入和结果检查。 < / p>
我需要这个程序在不到0.2秒的时间内运行:
0&lt; n,m <= 50000
-1000&lt; = a [i]&lt; = 1000
1·; = X&LT; = Y&LT; = N
如何让它更有效地运行?
答案 0 :(得分:2)
当accummulate
和n
很大时,m
功能可以花费大量时间。
我们在示例中使用以下数据:
const int n = 10;
int a[n] = {6, 1, 3, 2, 9, 8, 7, 2, 0, 1};
让我们创建一个辅助数组,并为每个a[0]
填充a[i]
到i
之和。这可以在一个循环中完成。
int s[n+1];
void precalculate() {
s[0] = 0;
for (int i = 0; i < n; ++i) {
s[i+1] = s[i] + a[i];
}
}
然后整个accummulate
函数折叠为单个减法:
int accummulate(int i, int j) {
return s[j] - s[i-1];
}
它很好用,因为它可以很容易地证明:
int main() {
precalculate();
assert(accummulate(1, 1) == 6);
assert(accummulate(10, 10) == 1);
assert(accummulate(1, 10) == 39);
return 0;
}