4 solutions

  • 1
    @ 2025-11-18 13:27:32

    解题报告

    撰写人: 钟志杰

    题意分析

    这道题如果直接用暴力就会超时,所以我们要用第二种方法,那就是前缀和!

    难度等级

    ★☆☆☆☆

    解题思路

    这道题重点在于前缀和,那么前缀和是什么呢?前缀和如下:
    前缀和指的是从a[1]加到a[i]的值,其实只要用k[i]=k[i-1]+a[i]即可(k为前缀和数组)
    求从a到b就简单了!
    只要用k[b]-k[a-1],就可以了,记住:k[a-1]不要写成k[a]了!

    解题反思

    参考程序

    #include<bits/stdc++.h>
    #define LL long long 
    using namespace std;
    LL n,m,x,s[100005],l,r;
    int main(){//主函数
        cin>>n>>m;
        for(int i=1;i<=n;i++){
        	cin>>x;
        	s[i]=s[i-1]+x;//计算前缀和
        }
        for(int i=1;i<=m;i++){
        	cin>>l>>r;
        	cout<<s[r]-s[l-1]<<endl;//把l到r的值算出来
        }
        return 0;
    }
    
    
    • 0
      @ 2025-11-11 17:21:01

      u合格i路虎如图任何人鸡儿隔热uu

      • 0
        @ 2025-11-4 17:02:32

        小朋友,咱们一起来看看这道题哈。题目说要输入一个长度为n的整数序列,然后还有m个询问,每个询问会告诉咱们从第l个数到第r个数,让咱们算出这中间数的和。咱们可以用前缀和的方法来解决这个问题哦。啥是前缀和呢,就好比咱们有一排小积木,每个积木都有自己的数字,前缀和就是从第一个积木开始一直加到当前这个积木的数字总和。

        接下来呀,我给你一步步讲怎么解题。 第一步,咱们得先读取整数序列的长度n和询问的次数m。 第二步呢,把整数序列存起来,同时算出前缀和。 第三步,对于每个询问,用前缀和相减就能得到答案啦。

        下面我给你看看对应的C++代码。

        #include<bits/stdc++.h>  // 这是万能头文件,能帮咱们用好多东西哦
        using namespace std; 
        
        int main() {
            int n, m;
            cin >> n >> m;  // 读取n和m,就像咱们知道有多少个小积木和要问几次问题
            int a[100005];  // 用来存整数序列的数组,就像一个小盒子,能装好多数字
            int s[100005] = {0};  // 存前缀和的数组,初始都为0
            for (int i = 1; i <= n; i++) {
                cin >> a[i];  // 把每个小积木上的数字放到盒子里
                s[i] = s[i - 1] + a[i];  // 算前缀和,就像从第一个积木一直加到当前这个积木的总和
            }
            for (int i = 0; i < m; i++) {
                int l, r;
                cin >> l >> r;  // 读取每个询问的l和r,就是从第几个积木到第几个积木
                cout << s[r] - s[l - 1] << endl;  // 用前缀和相减得到答案,就像把后面一段积木的总和减去前面一段积木的总和,剩下的就是中间这段积木的总和啦
            }
            return 0;
        }
        

        这样,咱们就能把每个询问的结果算出来啦。

        • 0
          @ 2025-11-4 16:59:01
          #include <iostream>
          using namespace std;
          int n,m,a,x,y,s[100005];
          int main() {
              cin>>n>>m;
              s[0]=0;
              for(int i=1;i<=n;i++)
          	{
          		cin>>a;
          		s[i]=s[i-1]+a;
          	}
              for(int i=1;i<=m;i++)
              {
              	cin>>x>>y;
              	cout<<s[y]-s[x-1]<<endl;
          	}
              return 0;
          }
          
          • 1

          Information

          ID
          598
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          5
          Tags
          (None)
          # Submissions
          94
          Accepted
          33
          Uploaded By