1 条题解

  • 6
    @ 2025-11-8 19:17:08

    (1) 对于静态数组多次区间查询, 采用前缀和处理以优化时间;

    (2) 题目要等差求和, 于是初始化等差前缀和数组ladder;

    (3) 对于ladder[r] - ladder[l - 1], 区间内每个元素都多加了l - 1倍,

    于是减去(l - 1) * (sum[r] - sum[l - 1]),

    对此需要初始化sum前缀和数组.

    #include <bits/stdc++.h>
    #define endl '\n'
    #define int long long
    using namespace std;
    
    const int mod = 998244353;
    const int N = 1e5 + 5;
    
    int n, q, l, r;
    int a[N], ladder[N], sum[N];
    
    signed main()
    {
        cin >> n >> q;
        for(int i = 1; i <= n; i++) {
            cin >> a[i];
            ladder[i] = (ladder[i - 1] + (i * a[i]) % mod) % mod;
            sum[i] = (sum[i - 1] + a[i]) % mod;
        }
    
        while(q--) {
            cin >> l >> r;
            int x = (ladder[r] - ladder[l - 1] + mod) % mod;
            int y = (l - 1) * ((sum[r] - sum[l - 1] + mod) % mod) % mod;
            cout << (x - y + mod) % mod << endl;
        }
    }
    
    
    • 1

    信息

    ID
    1189
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    232
    已通过
    24
    上传者