专栏文章
AT_abc423_e [ABC423E] Sum of Subarrays
AT_abc423_e题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minvpo7k
- 此快照首次捕获于
- 2025/12/02 09:08 3 个月前
- 此快照最后确认于
- 2025/12/02 09:08 3 个月前
vp 的时候一发过的,很显然的前缀和计数。
首先我们发现,对于每一对 和 来说,只有 满足 ,这个 才会对答案产生贡献,那么我们可以意识到,如果有一组 满足 ,那么 便会对答案产生一次贡献,我们只需要求所有的满足要求的 的数量即可,很显然一共有 组 满足要求,这里请读者自行思考这个计数。
那么每一个满足 的 对答案的贡献即为
把这个式子化开并整理后得到
处理一下 和 以及 三者的前缀和即可。
时间复杂度为 ,显然不会超时。
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, q;
const int N = 3e5 + 10;
int a[N];
int sum[N];
int j2sum[N], jsum[N];
signed main(void) {
cin >> n >> q;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
jsum[i] = jsum[i - 1] + a[i] * i;
j2sum[i] = j2sum[i - 1] + a[i] * i * i;
}
while (q --) {
int l, r;
cin >> l >> r;
int ans = sum[r] - sum[l - 1];
ans *= (r - l - l * r + 1);
ans -= (j2sum[r] - j2sum[l - 1]);
ans += (l + r) * (jsum[r] - jsum[l - 1]);
cout << ans << endl;
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...