[R1C]区间求和
在所有可以的区间中,一个数被计算的次数也就是它的贡献取决于它左边的数字数目a和它右边的数字数目b
answer=(a+1)(b+1)
例如[1,1,2,3,9] 这个系列中 2被计算的序列如下
1,1,2
1,1,2,3
1,1,2,3,9
1,2
1,2,3
1,2,3,9
2
2,3,9
2,3
一共9次也就是, 2的左边有2个数(1,1),2的右边有2个数(3,9),那么2被计算的序列个数应该就是(2+1)(2+1)=9
强化版的题目见 [R19E]区间和 https://www.cnblogs.com/itdef/p/18977560
// 3. [R1C]区间求和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
[R1C]区间求和
原题地址:https://bs.daimayuan.top/p/3
题目描述
给定一个长度为 n 的正整数数组 A,将 A 的第 l 位到第 r 位称为子区间 [l,r] = {Al,Al+1,...,Ar},定义这个子区间的价值 f(l,r) = sum(i=l to r) Ai。
求数组 A 的所有子区间的价值之和 sum(i=1 to n) sum(j=i to n) f(i,j)。
输入格式
第一行包含一个正整数 n,表示数组 A 的长度。
第二行包含 n 个正整数,表示数组 A。
输出格式
输出一个整数,表示数组 A 的所有子区间的价值之和。
样例输入
4
2 3 3 3
样例输出
56
数据范围与提示
对于 30% 的数据,n <= 100。
对于 60% 的数据,n <= 5000。
对于 100% 的数据,1 <= n <= 10^5,1 <= Ai <= 10^3。
*/
#include <iostream>
using namespace std;
const int N = 100010;
int arr[N];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
long long sum = 0;
for (int i = 1; i <= n; i++) {
sum += 1LL * arr[i] * (i) * (n - i + 1);
}
cout << sum << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
浙公网安备 33010602011771号