Título
Introduzca una secuencia de números enteros de longitud n.
A continuación, ingrese m consultas e ingrese un par de l, r para cada consulta.
Para cada consulta, genere la suma desde el número 1 hasta el número 6 en la secuencia original.
Formato de entrada
La primera línea contiene dos números enteros n y m.
La segunda línea contiene n números enteros, que representan una secuencia de números enteros.
Las siguientes m líneas, cada línea contiene dos números enteros lyr, que representan el rango de una consulta.
Formato de salida
Un total de m líneas, cada línea genera un resultado de consulta.
rango de datos
1≤l≤r≤n,
1≤n, m≤100000,
−1000≤ El valor del elemento en la secuencia ≤1000
Muestra de entrada:
5 3
2 1 3 6 4
1 2
1 3
2 4
Salida de muestra:
3
6
10
Método 1: enumeración violenta
#include <iostream>
using namespace std;
const int N=100010;
int main()
{
int s[N];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
while(m--)
{
int l,r;
int sum=0;
cin>>l>>r;
for(int i=l;i<=r;i++)
{
sum+=s[i];
}
cout<<sum<<endl;
}
return 0;
}
Método 2: función de acumulación
La función de acumulación generalmente tiene dos usos, uno de los cuales se usa para acumular elementos de matriz.
Uso: acumular (primer puntero, último puntero, acumular valor inicial) El
archivo de encabezado es: #include <numérico>
#include <iostream>
#include<numeric> //注意头文件
using namespace std;
const int N=100010;
int main()
{
int s[N];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i]; //输入序列
}
while(m--)
{
int l,r;
cin>>l>>r;
cout<<accumulate(s+l,s+r+1,0)<<endl; //直接计算出数列在区间[l,r]的和
}
return 0;
}
Método tres: prefijo y algoritmo
#include <iostream>
using namespace std;
const int N=100010;
int main()
{
int s[N];
int n,m;
cin>>n>>m;
s[0]=0;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]=s[i-1]+s[i]; //初始化前缀和数组s[]
}
while(m--)
{
int l,r;
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl; //利用前缀和算法计算区间[l,r]上的值
}
return 0;
}