|
@@ -173,3 +173,87 @@ func readFloat() float64 {
|
173
|
173
|
fmt.Fscanf(input, "%f", &x)
|
174
|
174
|
return x
|
175
|
175
|
}
|
|
176
|
+
|
|
177
|
+// Prioq
|
|
178
|
+
|
|
179
|
+// Invariant: both children are bigger
|
|
180
|
+
|
|
181
|
+type prioq struct {
|
|
182
|
+ bintree []*Car
|
|
183
|
+}
|
|
184
|
+
|
|
185
|
+func (pq *prioq) Add(car *Car) {
|
|
186
|
+ pq.bintree = append(pq.bintree, car)
|
|
187
|
+
|
|
188
|
+ // Rebalance tree to respect invariant
|
|
189
|
+ var i = len(pq.bintree) - 1
|
|
190
|
+ var p = (i - 1) / 2
|
|
191
|
+ for p >= 0 && pq.bintree[p].Arrival > pq.bintree[i].Arrival {
|
|
192
|
+ pq.bintree[p], pq.bintree[i] = pq.bintree[i], pq.bintree[p]
|
|
193
|
+ i = p
|
|
194
|
+ p = (i - 1) / 2
|
|
195
|
+ }
|
|
196
|
+}
|
|
197
|
+
|
|
198
|
+func (pq *prioq) Pop() *Car {
|
|
199
|
+ if len(pq.bintree) == 0 {
|
|
200
|
+ return nil
|
|
201
|
+ }
|
|
202
|
+
|
|
203
|
+ if len(pq.bintree) == 1 {
|
|
204
|
+ elem := pq.bintree[0]
|
|
205
|
+ pq.bintree = pq.bintree[:0]
|
|
206
|
+ return elem
|
|
207
|
+ }
|
|
208
|
+
|
|
209
|
+ elem := pq.bintree[0]
|
|
210
|
+ // Put last element at root
|
|
211
|
+ pq.bintree[0] = pq.bintree[len(pq.bintree)-1]
|
|
212
|
+ // Remove last element
|
|
213
|
+ pq.bintree = pq.bintree[:len(pq.bintree)-1]
|
|
214
|
+
|
|
215
|
+ // 1 9
|
|
216
|
+ // 10 9 10 12
|
|
217
|
+ // 11 12 13 14 -> 11 12 13 14
|
|
218
|
+ // 12
|
|
219
|
+
|
|
220
|
+ // Rebalance tree to respect invariant
|
|
221
|
+ len := len(pq.bintree)
|
|
222
|
+ i, left, right := 0, 0, 0
|
|
223
|
+ for {
|
|
224
|
+ left = 2*i + 1
|
|
225
|
+ right = 2*i + 2
|
|
226
|
+ if left < len && right < len { // Two children
|
|
227
|
+ if pq.bintree[left].Arrival <= pq.bintree[right].Arrival {
|
|
228
|
+ if pq.bintree[i].Arrival <= pq.bintree[left].Arrival {
|
|
229
|
+ break // Inferior to both children
|
|
230
|
+ } else {
|
|
231
|
+ pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
|
|
232
|
+ i = left
|
|
233
|
+ }
|
|
234
|
+ } else {
|
|
235
|
+ if pq.bintree[i].Arrival <= pq.bintree[right].Arrival {
|
|
236
|
+ break // Inferior to both children
|
|
237
|
+ } else {
|
|
238
|
+ pq.bintree[i], pq.bintree[right] = pq.bintree[right], pq.bintree[i]
|
|
239
|
+ i = right
|
|
240
|
+ }
|
|
241
|
+ }
|
|
242
|
+ } else if left < len { // One child (left)
|
|
243
|
+ if pq.bintree[i].Arrival <= pq.bintree[left].Arrival {
|
|
244
|
+ break // Inferior to only child
|
|
245
|
+ }
|
|
246
|
+ pq.bintree[i], pq.bintree[left] = pq.bintree[left], pq.bintree[i]
|
|
247
|
+ i = left
|
|
248
|
+ } else { // No child
|
|
249
|
+ break
|
|
250
|
+ }
|
|
251
|
+
|
|
252
|
+ }
|
|
253
|
+
|
|
254
|
+ return elem
|
|
255
|
+}
|
|
256
|
+
|
|
257
|
+func (pq *prioq) empty() bool {
|
|
258
|
+ return len(pq.bintree) == 0
|
|
259
|
+}
|