1. accumulate函数介绍
accumulate函数包含在 #include<numeric> 头文件下,其中有三个参数,前两个参数是累加元素的范围,第三个参数是累加的初值。一般第三个参数值为0。
2. 容器迭代器的使用
每种容器类型都定义了自己的迭代器类型,如vector:vector< int>:: iterator iter;//定义一个名为iter的变量,数据类型是由vector< int>定义的iterator 类型。简单说就是容器类定义了自己的iterator类型,用于访问容器内的元素。每个容器定义了一种名为iterator的类型,这种类型支持迭代器的各种行为。
题目分析
题目需要计算从l-r范围的数组和,所以accumulate的前两个参数要从l到r,且需要是迭代器类型,所以定义两个迭代器
vector<int>::iterator p,q;
代码
使用accumulate函数,TLE:
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
vector<int> a(N);
int main(){
int n,m,x,l,r;
vector<int> a(N);
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
while(m--){
scanf("%d %d",&l,&r);
vector<int>::const_iterator p=a.begin()+l-1;
vector<int>::const_iterator q=a.begin()+r;
int sum=accumulate(p,q,0);
printf("%d\n",sum);
}
return 0;
}
AC代码
在输入数字的时候就计算出前i项数组的和s[i],然后使用s[r]-s[l-1]来求l-r的和
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int s[N];
int main(){
int n,m,l,r;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
}
while(m--){
scanf("%d %d",&l,&r);
printf("%d\n",s[r]-s[l-1]);
}
return 0;
}
(112条消息) C++的STL中accumulate函数用法_遂..的博客-CSDN博客_accumulate函数c++
(112条消息) C++容器vector的数组片段截取操作_stitching的博客-CSDN博客_vector截取一部分
(112条消息) C++之迭代器(Iterator)篇_CSDN_564174144的博客-CSDN博客_c++迭代器