[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;
}

posted on 2025-07-10 14:48  itdef  阅读(15)  评论(0)    收藏  举报

导航