区间加权和

 

试题描述

长度为n的数列A,以及q个询问,每次询问一段区间的加权和s,第一个数*1,第二个数*2,以此类推。

s=ΣAi*(i-L+1) (L<=i<=R)

输入
第一行,一个整数n
第二行,n个数,表示A数组,用空格隔开。
第三行,一个正整数q
第4到第q+3行每行两个正整数L、R(L<=R),表示一段区间,用一个空格隔开。
输出
针对每个询问,输出结果。每个结果占一行。
输入示例
5
3 2 4 3 5
3
1 3
2 5
3 4
输出示例
19
39
10
其他说明
数据规模:n, q, Ai<=100000
 

思路见相册

 1 #include <iostream>
 2 
 3 using namespace std;
 4 long long a[101010],s[101010],w[101010];
 5 int main()
 6 {
 7     long long n,i;
 8     scanf("%lld",&n);
 9     for(i=1;i<=n;i++) 
10     {
11         scanf("%lld",&a[i]);
12         s[i]=s[i-1]+a[i];
13         w[i]=w[i-1]+s[i];
14     }
15     long long q,x,y,temp;
16     scanf("%lld",&q);
17     for(i=1;i<=q;i++)
18     {
19         scanf("%lld%lld",&x,&y);
20         temp=(y-x+1)*s[y]-(w[y-1]-w[x-2]);
21         printf("%lld\n",temp);
22     }
23     return 0;
24 }
区间加权和

 

转载于:https://www.cnblogs.com/YXY-1211/p/5347636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值