首页 > 试题广场 >

【模板】前缀和

[编程题]【模板】前缀和
  • 热度指数:23829 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}对于给定的长度为 n 的数组 \{a_1,a_2,\dots,a_n\} ,我们有 m 次查询操作,每一次操作给出两个参数 l,r ,你需要输出数组中第 l 到第 r 个元素之和,即 a_l + a_{l+1} + \dots + a_r 。

输入描述:
\hspace{15pt}第一行输入两个整数 n,m \left( 1 \leqq n,m \leqq 10^5\right) 代表数组中的元素数量、查询次数。
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n \left( -10^9 \leqq a_i \leqq 10^9 \right) 代表初始数组。
\hspace{15pt}此后 m 行,每行输入两个整数 l,r \left( 1 \leqq l \leqq r \leqq n \right) 代表一次查询。


输出描述:
\hspace{15pt}对于每一次查询操作,在一行上输出一个整数,代表区间和。
示例1

输入

3 2
1 2 4
1 2
2 3

输出

3
6
#include <stdio.h>

int main() {
    int n,q,a,b;
    long long r;
    scanf("%d %d",&n,&q);
    int c[n+1];
    c[0]=0;
    long long d[n+1];
    d[0]=0;
    for (int i=1; i<n+1; i++) {
         scanf("%d",&c[i]);
         d[i]=d[i-1]+c[i];
    }
    while (q--) {
       
        scanf("%d %d", &a, &b);
         
              r=d[b]-d[a-1];
        
        printf("%lld\n",r);
    }
    
    return 0;
}

发表于 2024-12-01 14:59:15 回复(0)
#include <stdio.h>

int main() {
    long long n,q;
    long long *p1;
    scanf("%d%d",&n,&q);
    long long arr[1000];
    long long brr[100];
    p1=arr;
    for(int i=0;i<n;i++){
        scanf("%lld",&arr[i]);
    }
    long long a,b;
    long long t=0;
    while(q){
        scanf("%lld%lld",&a,&b);
        long long sum=0;
        for(int i=a-1;i<b;i++){
            sum+=*(p1+i);
        }
        brr[t++]=sum;
        q--;
    }
    for(int i=0;i<t;i++){
        printf("%lld\n",brr[i]);
    }
    return 0;
}我这段代码为什么有些样例通不过,求解
发表于 2022-12-03 17:46:56 回复(0)