加权前缀和
时间限制:1.0s 内存限制:256.0MB 代码提交间隔:1分钟(现在可以提交)
问题描述
给定一个长度为n的数列a以及q次询问。
询问共有两种:
询问1:给定x和y,询问第x个数至第y个数的和
询问2:给定x和y,询问第x个数至第y个数的加权和。其中,区间内的第1个数的权重为1,第2个数的权重为2,以此类推。
输入格式
第一行包含一个正整数n,表示数列长度。
第二行共有n个非负整数,表示数列a。
第三行包含一个正整数q,表示询问数量。
随后q行,每行三个正整数k、x、y,用来描述询问。k表示询问的类型,x、y表示询问的区间。
输出格式
共q行,每行一个整数,表示询问的答案。
样例输入
5
1 2 3 4 5
3
1 2 4
2 2 3
2 3 5
样例输出
9
8
26
数据规模和约定
n, q<=100000,数列中的每个数不超过1000
#include <cstdio>
using namespace std;
int main() {
long long n, k, z, x, y, a, i;
scanf("%lld", &n);
long long sum[n + 10] = {0}, num[n + 10] = {0};
for (i = 1; i <= n; i++){
scanf("%lld", &a);
sum[i] = sum[i - 1] + a;
num[i] = num[i - 1] + sum[i];
}
scanf("%lld", &k);
for (i = 1; i <= k; i++){
scanf("%d%lld%lld", &z, &x, &y);
if (z == 1) printf("%lld\n", sum[y] - sum[x - 1]);
else if (z == 2) printf("%lld\n", (y - x + 1) * sum[y] - (num[y - 1] - num[x - 2]));
}
return 0;
}