1 条题解

  • 0
    @ 2026-3-5 9:24:18

    文字教学

    这道题数据量大,直接每次遍历区间求和会超时,用前缀和数组可以高效解决:

    1. 定义前缀和数组 s,其中 s[i] 表示数列前 i 个数的和(s[0]=0)。
    2. 预处理:遍历数列,计算 s[i] = s[i-1] + a[i]
    3. 查询区间 [l,r] 的和:直接用 s[r] - s[l-1] 得到结果。 这样预处理是O(n),每次查询是O(1),能轻松处理1e5的数据。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int a[100005], s[100005], n, m, l, r;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
            s[i] = s[i-1] + a[i];
        }
        cin >> m;
        while (m--) {
            cin >> l >> r;
            cout << s[r] - s[l-1] << '\n';
        }
        return 0;
    }
    
    • 1

    信息

    ID
    6837
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    14
    已通过
    8
    上传者