結果
| 問題 |
No.872 All Tree Path
|
| コンテスト | |
| ユーザー |
yakamoto
|
| 提出日時 | 2019-08-31 01:19:08 |
| 言語 | Kotlin (2.1.0) |
| 結果 |
AC
|
| 実行時間 | 1,160 ms / 3,000 ms |
| コード長 | 1,810 bytes |
| コンパイル時間 | 19,464 ms |
| コンパイル使用メモリ | 463,040 KB |
| 実行使用メモリ | 115,976 KB |
| 最終ジャッジ日時 | 2024-11-22 08:27:32 |
| 合計ジャッジ時間 | 31,900 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 18 |
ソースコード
import kotlin.math.max
import kotlin.math.min
// なんか本番でエラーでる
private val isDebug = runCatching {
System.getenv("MY_DEBUG") != null
}.fold({it}, {false})
private fun readLn() = readLine()!!
private fun readInt() = readLn().toInt()
private fun readStrings() = readLn().split(" ")
private fun readInts() = readStrings().map { it.toInt() }.toIntArray()
private fun readLongs() = readStrings().map { it.toLong() }.toLongArray()
private fun debug(msg: () -> String) {
if (isDebug) System.err.println(msg())
}
private fun debug(a: IntArray) {
if (isDebug) debug{a.joinToString(" ")}
}
val MOD = 1000000007
data class Entry(val i: Int, val x: Long)
fun main() {
val N = readInt()
val g = Array<MutableList<Int>>(N){ mutableListOf()}
val U = IntArray(N - 1)
val V = IntArray(N - 1)
val W = IntArray(N - 1)
repeat(N - 1) {
var (u, v, w) = readInts()
u--; v--
g[u].add(v)
g[v].add(u)
U[it] = u
V[it] = v
W[it] = w
}
val (p, q) = traceBfs(g)
val dp = IntArray(N)
for (i in N - 1 downTo 0) {
val v = q[i]
dp[v]++ // 自分
for (u in g[v]) {
if (u != p[v]) {
dp[v] += dp[u]
}
}
}
debug(dp)
debug(p)
debug(q)
var ans = 0L
for (i in 0 until N - 1) {
val cnt = if (p[U[i]] == V[i]) {
dp[U[i]]
} else {
dp[V[i]]
}
ans += cnt.toLong() * (N - cnt) * W[i] * 2
}
println(ans)
}
/**
* (parent, queue)
*/
fun traceBfs(g: Array<MutableList<Int>>, rt: Int = 0): Array<IntArray> {
val n = g.size
val q = IntArray(n)
val p = IntArray(n){-2}
var cur = 0
var last = 1
p[0] = -1
q[0] = rt
while (cur < last) {
val v = q[cur++]
for (u in g[v]) {
if (p[u] == -2) {
p[u] = v
q[last++] = u
}
}
}
return arrayOf(p, q)
}
yakamoto