1 条题解

  • 1
    @ 2025-07-27 10:15:06

    这道题目很明显,普通的做法就是给定l,r,用一个for循环枚举这个区间,求和输出,代码如下:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        int n,q;
        cin>>n>>q;
        int a[100010],dp[100010];
        for(int i=1;i<=n;i++) cin>>a[i];
        while(q--)
        {
            int l,r;
            cin>>l>>r;
            int sum=0;
            for(int i=l;i<=r;i++) sum+=a[i];
            cout<<sum<<endl;
        }
        return 0;
    }
    

    但是,我们观察数据范围:对于\(100\)%的数据,\(n,q≤10^5\)
    上面的代码时间复杂度为O(n²),上面的代码很可能会超时TLE。
    在观察一下题目,这道题不就是前缀和吗?
    前缀和的区间和。
    那么区间和代码就不用说了,相信大家都会。不会的去这篇文章看:https://www.luogu.com.cn/article/5q66tgtj
    代码如下:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        int n,q;
        cin>>n>>q;
        int a[100010],dp[100010];
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            if(i==1) dp[i]=a[i];
            else dp[i]=dp[i-1]+a[i];
        }
        while(q--)
        {
            int l,r;
            cin>>l>>r;
            cout<<dp[r]-dp[l-1]<<endl;
        }
        return 0;
    }
    

    这道题就AC了,是不是非常的简单(难怪是CSP-J的T1,虽然是模拟赛)

  • 1

信息

ID
1001
难度
3
分类
模拟 点击显示
标签
递交数
2
已通过
1
通过率
50%
上传者