1 条题解
-
6
(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; } }
信息
- ID
- 1189
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 240
- 已通过
- 24
- 上传者