Problem: 每次测试时间限制:1.5秒 每次测试的内存限制:256MB 输入:标准输入 输出:标准输出

给定2个数字NQ,N个数字的数组AQ个数字对LR.对于每个查询Q,打印包含从索引L到索引R的所有数字的总和的单行.

Input

  1. 第一行包含两个数字NQ (1≤N,Q≤10^5),其中NA中的元素数,Q是查询对的数.
  2. 第二行包含N个数字**(1≤AI≤10^9)**.
  3. 接下来的Q行包含L,R,(1 ≤ L ≤ R ≤ N).

Output个 对于每个查询Q,打印一行,该行包含从索引L到索引R的所有数字的总和.

Examples:

input个个

 6 3
 6 4 2 7 2 7
 1 3
 3 6
 1 6

output个个

 12
 18
 28

input个个

 4 3
 5 5 2 3
 1 3
 2 3
 1 4

output个个

 12
 7
 15

我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, q;
    scanf("%d %d", &n, &q);

    long long int sum[100001];
    for (int i = 0; i < n; i++)
    {
        long long int num;
        scanf("%lld", &num);
        if (i == 0)
        {
            sum[i] = num;
        }
        else
        {
            sum[i] = sum[i-1] + num;
        }
    }

    for (int j = 0; j < q; j++)
    {
        int l,r;
        scanf("%d %d", &l, &r);
        if (l == 1)
        {
            printf("%d\n", sum[r - 1]);
        }
        else
        {
            printf("%d\n", sum[r - 1] - sum[l - 2]);
        }
    }
    return 0;
}

我试图通过定义一个名为sum的数组来解决这个问题.第一个循环将单独扫描,并通过与先前输入相加存储在和数组中.然后,在第二个循环中,它将扫描范围并打印总和.如果L等于1,则求和在和数组中的索引[r-1]处.否则,索引[L-2]处的求和将从索引[r-1]处的求和中减go .

Explaining my algorithm:

input:

 6 1
 6 4 2 7 2 7
 3 6
Explanation:
sum[0] = 6, sum[1] = 10, sum[2] = 12, sum[3] = 19, sum[4] = 21, sum[5] = 28
Answer will be ( sum[6 - 1] - sum[3 - 2] ) 
             = ( sum[5] - sum[1] ) 
             = 28 - 10 
             = 18 
             = 2+7+2+7

这种方法已经成功地通过了三次测试.但是,它显示了"Wrong answer on test 4".请帮我找出我的错误.

推荐答案

printf("%d\n", sum[r - 1])应该是printf("%lld\n", sum[r - 1]).打印同上sum[r - 1] - sum[l - 2].


代码可以通过在sum[0]中存储0来缩短:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, q;
    scanf("%d%d", &n, &q);

    long long int sum[100001];
    sum[0] = 0;
    for (int i = 1; i <= n; i++)
    {
        long long int num;
        scanf("%lld", &num);
        sum[i] = sum[i - 1] + num;
    }

    for (int j = 0; j < q; j++)
    {
        int l,r;
        scanf("%d%d", &l, &r);
        printf("%lld\n", sum[r] - sum[l - 1]);
    }
    return 0;
}

C++相关问答推荐

C:gcc返回多个错误定义,但msvc—不""'

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

在#include中使用C宏变量

C:二进制搜索和二进制插入

为什么在此程序中必须使用Volatile关键字?

难以理解Makefile隐含规则

为什么C语言允许你使用var =(struct NAME){

在一个小型玩具项目中实现终端历史记录功能

Sizeof(&Q;字符串&Q;)的正确输出是什么?

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

处理来自浏览器的HTTP请求

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

pthread_create的用法

Fscanf打印除退出C代码为1的程序外的所有内容

共享目标代码似乎不能在Linux上的进程之间共享

如何在MSVC中使用intSafe.h函数?

将char*数组深度复制到 struct 中?

'printf("%s", user_input)' 危险吗?

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

在带中断的循环缓冲区中使用 易失性