2 solutions

  • 1
    @ 2026-6-9 22:57:27

    P1004 flying的刷题记录

    一.解题思路

    1.碎碎念

    背景竟然是我!虽然但是俺备战🏀杯刷的那几道题其实一只手就能数过来(雾

    所以 理论上来讲,暴力完全应该能做,但显然社长认为俺很勤奋,竟然能刷这么多!

    2.题目详解

    其实就是给你一串数字,然后问你每一段的和,数据量小的话直接上手数比写代码快,但如果比较大的话,那就不得不掏出我们的神器——— 前缀和 了!

    3.算法实现

    核心代码:pre[i] = pre[i-1] + num[i]; 这一串就是前缀和的核心了,字面意思,假设给你一串数字

    1 1 4 5 1 4

    那么**pre[1]pre[6]**就是

    1 2 6 11 12 16

    pre[2]就是pre[1]加上num[2]

    这样做在计算区间和时就不用面对可恶的TLE

    比如,还是刚拿一串114514,L=2,R=6的话,直接数ans=1+4+5+1+4 = 15

    前缀和的话就是pre[R]-pre[L-1] = 16-1 = 15

    省去了大量复杂重复的计算,简直就是(最)伟大的算法(之一)!

    4.复杂度

    1.时间:O(n+q)

    2.空间:O(n)

    二.完整代码

    PS:非专业题解!有任何错误记得联系我!!!

    • -1
      @ 2026-6-16 12:04:26

      C语言 #include<stdio.h>

      #define MAX_N 100005

      long long prefix[MAX_N];

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

      prefix[0]=0;
      
      for(int i=1;i<=n;i++)
      {
          int val;
          scanf("%d",&val);
          prefix[i]=prefix[i-1]+val;
      }
      while(q--)
      {
          int L,R;
          scanf("%d %d",&L,&R);
      
          printf("%lld\n",prefix[R]-prefix[L-1]);
      }
      
      return 0;
      

      }

    • 1

    Information

    ID
    4
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    2
    Tags
    # Submissions
    33
    Accepted
    10
    Uploaded By