こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
最長の区間 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】
実装
まずは以下のように実装しました。
package main
import "fmt"
func main(){
var n, m int
fmt.Scan(&n, &m)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&a[i])
}
s := make([]int, n)
for i := 0; i < m; i++ {
var mn, mx, t int
fmt.Scan(&mn, &mx, &t)
for k := mn - 1; k < mx; k++ {
s[k] +=
}
}
for i := 0; i < n; i++ {
fmt.Println(a[i] + s[i])
}
この回答でもGoの場合解けるのですが、まぁ実行時間制限ギリギリなので、一応模範解答のように改修しておきましょう。
この実装、よく考えると累積和で解けるんですよね。
つまり、mnとmxは累積和の区間として考えることができるわけです。
実装としては以下の通りです。
package main
import "fmt"
func main(){
var n, m int
fmt.Scan(&n, &m)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&a[i])
}
s := make([]int, n)
for i := 0; i < m; i++ {
var mn, mx, t int
fmt.Scan(&mn, &mx, &t)
s[mn - 1] += t
if mx < len(s) {
s[mx] -= t
}
}
x := 0
for i := 0; i < n; i++ {
x += s[i]
fmt.Println(a[i] + x)
}
}
あーすっきりした。
ではまた👍