La primera vez que jugué un partido de entrenamiento, todavía era demasiado joven y no tenía suficientes conocimientos.
Tema:
Dame el código que escribí en ese momento. (Usado 3 para bucles (), tiempo de espera).
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m;
int b1,b2;
while (cin>>n>>m)
{
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<m;i++)
{
int sum=0;
cin>>b1>>b2;
for(int i=b1;i<=b2;i++)
{
sum=a[i-1]+sum;
}
cout<<sum<<endl;
}
}
return 0;
}
El código escrito después de leer las soluciones de otras personas.
#include<bits/stdc++.h>//C++万能头文件
using namespace std;
long long sum[1000005];
int main()
{
long long n,m,s;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
cin>>s;
sum[i]=sum[i-1]+s;//一维前缀和
}
int i,j;
for(int i=1;i<=m;i++){
scanf("%d %d",&i,&j);
// //第1位到第j位的和减去第一位到第i-1位的和,得到第i位到第j位的和。
printf("%d\n",sum[j]-sum[i-1]);
}
return 0;
}
//
Aprendí un nuevo punto de conocimiento: suma de prefijo.
La suma de prefijos unidimensionales en
realidad puede entenderse como la suma de los primeros n términos de una secuencia unidimensional en matemáticas.
Para una secuencia A dada, su prefijo y secuencia S son una de la información básica que se puede obtener mediante recursividad:
S [i] = ∑A [j] (j ∈ [1, i]) Una suma parcial, Es decir, la suma de los números en el intervalo de la secuencia A en la siguiente tabla también se puede expresar en forma de prefijo y resta: suma (l, r) = ∑A [i] (i ∈ [l, r]) = S [r] -S [l-1].
Código:
int sum[1] = a[1];
for(int i=2;i<=n;i++){
sum[i] = sum[i-1] + a[i];
}
Con el prefijo y, oj dice OK (AC). Ollie da.