[R1C] 区间求和
- 难度 入门
- 时限 1s
- 空限 512m
- 数学
数据规模:,。
思路
把每个子区间的和拆成每个元素对答案的贡献: 会出现在所有满足 的子区间 中,这样的子区间共有 个(左端点 有 种选择,右端点 有 种选择)。
所以答案为 ,复杂度 。
复杂度:时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
var ans: Int64 = 0
for (i in 0..n) {
ans += a[i] * (i + 1) * (n - i)
}
println(ans)
return 0
}
要点:
- 最大答案约为 ,必须用
Int64,计算过程中也要防止溢出。 - 数组按题面在第二行一次性读入,行尾多余空格由
split(" ", removeEmpty: true)过滤。