結果
| 問題 |
No.705 ゴミ拾い Hard
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-02-05 20:50:15 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 558 ms / 1,500 ms |
| コード長 | 1,793 bytes |
| コンパイル時間 | 15,246 ms |
| コンパイル使用メモリ | 242,252 KB |
| 実行使用メモリ | 15,104 KB |
| 最終ジャッジ日時 | 2024-07-04 06:57:06 |
| 合計ジャッジ時間 | 26,892 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
)
// monotoneminima的应用
// dp[j]=min(dp[i]+f(i,j)) (i<j)
// O(n^2)优化到O(nlogn^2)
func offlineOnlineDp(n int, dist func(i, j int) int) int {
dp := make([]int, n+1)
used := make([]bool, n+1)
used[n] = true
update := func(k, val int) {
if !used[k] {
dp[k] = val
}
dp[k] = min(dp[k], val)
used[k] = true
}
var dfs func(top, bottom, left, right int)
dfs = func(top, bottom, left, right int) {
if top == bottom {
return
}
mid := (top + bottom) / 2
index := left
res := dist(mid, index) + dp[index]
for i := left; i <= right; i++ {
tmp := dist(mid, i) + dp[i]
if tmp < res {
res = tmp
index = i
}
}
update(mid, res)
dfs(top, mid, left, index)
dfs(mid+1, bottom, index, right)
}
var solve func(left, right int)
solve = func(left, right int) {
if left+1 == right {
update(left, dist(left, right)+dp[right])
return
}
mid := (left + right) / 2
solve(mid, right)
dfs(left, mid, mid, right)
solve(left, mid)
}
solve(0, n)
return dp[0]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
// 垃圾回收
// https://yukicoder.me/problems/no/705
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
starts, xs, ys := make([]int, n), make([]int, n), make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &starts[i])
}
for i := 0; i < n; i++ {
fmt.Fscan(in, &xs[i])
}
for i := 0; i < n; i++ {
fmt.Fscan(in, &ys[i])
}
dist := func(i, j int) int {
// 0<=i<j<=n
a := abs(starts[j-1] - xs[i])
b := abs(ys[i])
return a*a*a + b*b*b
}
res := offlineOnlineDp(n, dist)
fmt.Fprintln(out, res)
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}