Submission #17661476
Source Code Expand
func readInt3(line: Int = #line, file: String = #file) -> (Int, Int, Int) {
guard let string = readLine() else {
preconditionFailure("No input (at line \(line) in \(file))")
}
let values: [Int] = string.split(separator: " ").map { part in
guard let value = Int(part) else {
preconditionFailure("Illegal input value: \(string) (at line \(line) in \(file))")
}
return value
}
precondition(values.count == 3, "Illegal number of input values: count = \(values.count), values = \(values) (at line \(line) in \(file))")
return (values[0], values[1], values[2])
}
func readIntN(line: Int = #line, file: String = #file) -> [Int] {
guard let string = readLine() else {
preconditionFailure("No input (at line \(line) in \(file))")
}
let values: [Int] = string.split(separator: " ").map { part in
guard let value = Int(part) else {
preconditionFailure("Illegal input value: \(string) (at line \(line) in \(file))")
}
return value
}
return values
}
private struct _PriorityQueue<Element> {
private var elements: [Element] = []
private let areInIncreasingOrder: (Element, Element) -> Bool
init<S>(_ elements: S, by areInIncreasingOrder: @escaping (Element, Element) -> Bool) where S: Sequence, S.Element == Element {
self.areInIncreasingOrder = areInIncreasingOrder
for element in elements {
append(element)
}
}
init(by areInIncreasingOrder: @escaping (Element, Element) -> Bool) {
self.init(EmptyCollection(), by: areInIncreasingOrder)
}
var isEmpty: Bool { elements.isEmpty }
var count: Int { elements.count }
var first: Element? { elements.first }
mutating func append(_ element: Element) {
var i = elements.count
elements.append(element)
elements.withUnsafeMutableBufferPointer { elements in
while i > 0 {
let parentIndex = (i - 1) >> 1
let parent = elements[parentIndex]
guard areInIncreasingOrder(element, parent) else { break }
elements[parentIndex] = element
elements[i] = parent
i = parentIndex
}
}
}
mutating func popFirst() -> Element? {
guard let element = elements.popLast() else { return nil }
guard let first = elements.first else { return element }
elements.withUnsafeMutableBufferPointer { elements in
elements[0] = element
var i = 0
while true {
var childIndex: Int = (i << 1) + 1
guard childIndex < elements.count else { break }
var child: Element = elements[childIndex]
let rightIndex = childIndex + 1
if rightIndex < elements.count {
let right = elements[rightIndex]
if areInIncreasingOrder(right, child) {
childIndex = rightIndex
child = right
}
}
if areInIncreasingOrder(element, child) { break }
elements[childIndex] = element
elements[i] = child
i = childIndex
}
}
return first
}
}
protocol HasInfinity {
static var infinity: Self { get }
}
extension Int: HasInfinity { static var infinity: Int { .max } }
extension UInt: HasInfinity { static var infinity: UInt { .max } }
extension Float: HasInfinity {}
extension Double: HasInfinity {}
func dijkstra<Distance>(graph: [[(index: Int, distance: Distance)]], startedAt start: Int) -> [Distance] where Distance: Comparable, Distance: AdditiveArithmetic, Distance: HasInfinity {
var result: [Distance] = .init(repeating: .infinity, count: graph.count)
result[start] = .zero
var used = Array(repeating:false, count: graph.count)
var queue = _PriorityQueue<(Distance, Int)>(by: <=)
queue.append((.zero, start))
while let (_, from) = queue.popFirst() {
if used[from] { continue }
used[from] = true
for (to, distance) in graph[from]{
if result[from] + distance < result[to] {
result[to] = result[from] + distance
queue.append((result[to], to))
}
}
}
return result
}
let (n, m, t) = readInt3()
let aa = readIntN()
var graph1: [[(index: Int, distance: Int)]] = .init(repeating: [], count: n)
var graph2: [[(index: Int, distance: Int)]] = .init(repeating: [], count: n)
for _ in 1 ... m {
let (a, b, c) = readInt3()
graph1[a - 1].append((index: b - 1, distance: c))
graph2[b - 1].append((index: a - 1, distance: c))
}
let distances1 = dijkstra(graph: graph1, startedAt: 0)
let distances2 = dijkstra(graph: graph2, startedAt: 0)
var maxMoney: Int = .min
for i in 0 ..< n {
if distances1[i] == Int.max || distances2[i] == Int.max{
continue
}
let money = aa[i] * (t - distances1[i] - distances2[i])
if money > maxMoney { maxMoney = money }
}
print(maxMoney)
Submission Info
Submission Time |
|
Task |
D - トレジャーハント |
User |
tardigrade |
Language |
Swift (5.2.1) |
Score |
100 |
Code Size |
5297 Byte |
Status |
AC |
Exec Time |
509 ms |
Memory |
24724 KiB |
Judge Result
Set Name |
Sample |
Subtask1 |
All |
Score / Max Score |
0 / 0 |
50 / 50 |
50 / 50 |
Status |
|
|
|
Set Name |
Test Cases |
Sample |
00_example_01.txt, 00_example_02.txt, 00_example_03.txt |
Subtask1 |
00_example_01.txt, 00_example_02.txt, 00_example_03.txt, 50_small_01.txt, 50_small_02.txt, 50_small_03.txt, 50_small_04.txt, 50_small_05.txt, 50_small_06.txt, 50_small_07.txt, 50_small_08.txt, 50_small_09.txt, 50_small_10.txt, 60_hand_01.txt, 60_hand_02.txt, 60_hand_03.txt, 60_hand_04.txt, 70_max_01.txt, 70_max_02.txt, 70_max_03.txt |
All |
00_example_01.txt, 00_example_02.txt, 00_example_03.txt, 10_rand_01.txt, 10_rand_02.txt, 10_rand_03.txt, 10_rand_04.txt, 10_rand_05.txt, 10_rand_06.txt, 10_rand_07.txt, 10_rand_08.txt, 10_rand_09.txt, 10_rand_10.txt, 10_rand_12.txt, 10_rand_13.txt, 30_max_01.txt, 30_max_02.txt, 30_max_03.txt, 30_max_04.txt, 30_max_05.txt, 30_max_06.txt, 40_corner_01.txt, 40_corner_02.txt, 40_corner_03.txt, 40_corner_04.txt, 50_small_01.txt, 50_small_02.txt, 50_small_03.txt, 50_small_04.txt, 50_small_05.txt, 50_small_06.txt, 50_small_07.txt, 50_small_08.txt, 50_small_09.txt, 50_small_10.txt, 60_hand_01.txt, 60_hand_02.txt, 60_hand_03.txt, 60_hand_04.txt, 70_max_01.txt, 70_max_02.txt, 70_max_03.txt |
Case Name |
Status |
Exec Time |
Memory |
00_example_01.txt |
AC |
14 ms |
8380 KiB |
00_example_02.txt |
AC |
6 ms |
8228 KiB |
00_example_03.txt |
AC |
12 ms |
8416 KiB |
10_rand_01.txt |
AC |
40 ms |
8980 KiB |
10_rand_02.txt |
AC |
124 ms |
11224 KiB |
10_rand_03.txt |
AC |
48 ms |
9624 KiB |
10_rand_04.txt |
AC |
22 ms |
8620 KiB |
10_rand_05.txt |
AC |
51 ms |
9632 KiB |
10_rand_06.txt |
AC |
51 ms |
9912 KiB |
10_rand_07.txt |
AC |
67 ms |
10644 KiB |
10_rand_08.txt |
AC |
32 ms |
8972 KiB |
10_rand_09.txt |
AC |
61 ms |
10440 KiB |
10_rand_10.txt |
AC |
19 ms |
8760 KiB |
10_rand_12.txt |
AC |
200 ms |
12452 KiB |
10_rand_13.txt |
AC |
188 ms |
12224 KiB |
30_max_01.txt |
AC |
428 ms |
15648 KiB |
30_max_02.txt |
AC |
474 ms |
18288 KiB |
30_max_03.txt |
AC |
360 ms |
14320 KiB |
30_max_04.txt |
AC |
499 ms |
21588 KiB |
30_max_05.txt |
AC |
509 ms |
21504 KiB |
30_max_06.txt |
AC |
505 ms |
21660 KiB |
40_corner_01.txt |
AC |
413 ms |
24596 KiB |
40_corner_02.txt |
AC |
462 ms |
24644 KiB |
40_corner_03.txt |
AC |
483 ms |
24472 KiB |
40_corner_04.txt |
AC |
509 ms |
24724 KiB |
50_small_01.txt |
AC |
13 ms |
8196 KiB |
50_small_02.txt |
AC |
5 ms |
8080 KiB |
50_small_03.txt |
AC |
6 ms |
7988 KiB |
50_small_04.txt |
AC |
10 ms |
8268 KiB |
50_small_05.txt |
AC |
24 ms |
8484 KiB |
50_small_06.txt |
AC |
14 ms |
8504 KiB |
50_small_07.txt |
AC |
5 ms |
8460 KiB |
50_small_08.txt |
AC |
7 ms |
8148 KiB |
50_small_09.txt |
AC |
8 ms |
8148 KiB |
50_small_10.txt |
AC |
10 ms |
8120 KiB |
60_hand_01.txt |
AC |
6 ms |
8284 KiB |
60_hand_02.txt |
AC |
5 ms |
8416 KiB |
60_hand_03.txt |
AC |
5 ms |
8416 KiB |
60_hand_04.txt |
AC |
5 ms |
8088 KiB |
70_max_01.txt |
AC |
125 ms |
10328 KiB |
70_max_02.txt |
AC |
127 ms |
10188 KiB |
70_max_03.txt |
AC |
126 ms |
9992 KiB |