結果
問題 | No.318 学学学学学 |
ユーザー |
![]() |
提出日時 | 2019-04-18 14:59:57 |
言語 | Nim (2.2.0) |
結果 |
AC
|
実行時間 | 72 ms / 2,000 ms |
コード長 | 3,028 bytes |
コンパイル時間 | 3,920 ms |
コンパイル使用メモリ | 72,884 KB |
実行使用メモリ | 24,240 KB |
最終ジャッジ日時 | 2024-07-01 23:12:31 |
合計ジャッジ時間 | 6,502 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
type HeapQueue*[T] = distinct seq[T]proc newHeapQueue*[T](): HeapQueue[T] {.inline.} = HeapQueue[T](newSeq[T]())proc newHeapQueue*[T](h: var HeapQueue[T]) {.inline.} = h = HeapQueue[T](newSeq[T]())proc len*[T](h: HeapQueue[T]): int {.inline.} = seq[T](h).lenproc `[]`*[T](h: HeapQueue[T], i: int): T {.inline.} = seq[T](h)[i]proc `[]=`[T](h: var HeapQueue[T], i: int,v: T) {.inline.} = seq[T](h)[i] = vproc add[T](h: var HeapQueue[T], v: T) {.inline.} = seq[T](h).add(v)proc heapCmp[T](x, y: T): bool {.inline.} =return (x < y)# 'heap' is a heap at all indices >= startpos, except possibly for pos. pos# is the index of a leaf with a possibly out-of-order value. Restore the# heap invariant.proc siftdown[T](heap: var HeapQueue[T], startpos, p: int) =var pos = pvar newitem = heap[pos]# Follow the path to the root, moving parents down until finding a place# newitem fits.while pos > startpos:let parentpos = (pos - 1) shr 1let parent = heap[parentpos]if heapCmp(newitem, parent):heap[pos] = parentpos = parentposelse:breakheap[pos] = newitemproc siftup[T](heap: var HeapQueue[T], p: int) =let endpos = len(heap)var pos = plet startpos = poslet newitem = heap[pos]# Bubble up the smaller child until hitting a leaf.var childpos = 2*pos + 1 # leftmost child positionwhile childpos < endpos:# Set childpos to index of smaller child.let rightpos = childpos + 1if rightpos < endpos and not heapCmp(heap[childpos], heap[rightpos]):childpos = rightpos# Move the smaller child up.heap[pos] = heap[childpos]pos = childposchildpos = 2*pos + 1# The leaf at pos is empty now. Put newitem there, and bubble it up# to its final resting place (by sifting its parents down).heap[pos] = newitemsiftdown(heap, startpos, pos)proc push*[T](heap: var HeapQueue[T], item: T) =## Push item onto heap, maintaining the heap invariant.(seq[T](heap)).add(item)siftdown(heap, 0, len(heap)-1)proc pop*[T](heap: var HeapQueue[T]): T =## Pop the smallest item off the heap, maintaining the heap invariant.let lastelt = seq[T](heap).pop()if heap.len > 0:result = heap[0]heap[0] = lasteltsiftup(heap, 0)else:result = lastelt# https://github.com/nim-lang/Nim/blob/master/lib/pure/collections/heapqueue.nim# ---------------------------------------------------------------------------------------------- ## ---------------------------------------------------------------------------------------------- #import strutils, sequtils, tablesproc main() =letn = stdin.readLine.strip.parseInta = stdin.readLine.strip.split.map(parseInt)var right = initTable[int, int]()for i in 0..<n:right[a[i]] = ivarq = newHeapQueue[int]()b = newSeq[int](n)for i in 0..<n:while q.len > 0 and right[-q[0]] < i:discard q.popq.push(-a[i])b[i] = -q[0]echo b.map(proc(it: int): string = $it).join(" ")main()