zoukankan      html  css  js  c++  java
  • 前缀和

    小明碰到了一个问题,有一个长度为n(n<100000)数组和总询问次数m(m<100000),每次询问都要回答这个区间所有数字的总和,小明已经很累了,所以他把这个问题交给你。

    输入格式:

    第一行两个数n,m 下一行n个数a1,a2,a3......an. 然后m次询问. 每次给出l,r (1<=l<=r<=n)

    输出格式:

    每次询问输出区间所有数的和.

    输入样例:

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

    输出样例:

    15
    9
    3

    思路:如果对于不会前缀和的小白(就是本小白了)来说,可能直接就暴力做了,但是出题人就是要考你前缀和这个知识点,不超时那也说不过去,
    简单来讲,前缀和就是新建一个sum数组,记录从开始到当前位置的所有数据和,然后对于询问区间[left,right]的和就等于sum[right]-sum[left-1],
    left要减一是因为left的边界值也要算上,应该不难理解......


     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<cstdio>
     5 #include<algorithm>
     6 #include<map>
     7 #include<vector>
     8 #include<set>
     9 using namespace std;
    10 #define ll long long 
    11 #define inf 99999999
    12 const int maxn=100005;
    13 ll int num[maxn];//记录原始数据 
    14 ll int sum[maxn];//记录前缀和 
    15 int main()
    16 {
    17     memset(num,0,sizeof(num));
    18     memset(sum,0,sizeof(sum));
    19     int n,m;
    20     scanf("%d%d",&n,&m);
    21     //sum[0]=0;
    22     for(int i=1;i<=n;i++)
    23     {
    24         scanf("%lld",&num[i]);
    25         sum[i]=num[i]+sum[i-1];
    26     }
    27     for(int i=1;i<=m;i++)
    28     {
    29         int left,right;
    30         scanf("%d%d",&left,&right);
    31         printf("%lld
    ",sum[right]-sum[left-1]);
    32     }
    33     return 0;
    34 }


    大佬见笑,,
  • 相关阅读:
    穷举
    菱形
    6.824 Lab 3: Fault-tolerant Key/Value Service 3A
    6.824 Lab 2: Raft 2C
    6.824 Lab 2: Raft 2B
    一文学会Rust?
    字符串相似度匹配
    解决gson解析long自动转为科学计数的问题
    commonJs requirejs amd 之间的关系
    关于package.json的理解
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10808093.html
Copyright © 2011-2022 走看看