結果
| 問題 |
No.318 学学学学学
|
| コンテスト | |
| ユーザー |
t8m8⛄️
|
| 提出日時 | 2017-06-09 15:46:37 |
| 言語 | Nim (2.2.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,436 bytes |
| コンパイル時間 | 3,909 ms |
| コンパイル使用メモリ | 71,680 KB |
| 実行使用メモリ | 23,424 KB |
| 最終ジャッジ日時 | 2024-06-30 01:18:02 |
| 合計ジャッジ時間 | 8,671 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | AC * 6 TLE * 1 -- * 19 |
コンパイルメッセージ
/home/judge/data/code/Main.nim(1, 39) Warning: Use the new 'sugar' module instead; future is deprecated [Deprecated]
ソースコード
import strutils, sequtils, algorithm, future, tables
type
PrirorityQueue*[T] = ref object of RootObj
elms: seq[T]
cmp: (T, T) -> int
proc newPriorityQueue*[T](cmp: (T, T) -> int): PrirorityQueue[T] =
new(result)
result.elms = newSeq[T]()
result.cmp = cmp
template parent(cur: int): int =
(cur - 1) div 2
template childl(cur: int): int =
cur * 2 + 1
template childr(cur: int): int =
cur * 2 + 2
proc upHeap[T](self: var PrirorityQueue[T], cur: var int) =
var par = parent(cur)
while par >= 0 and self.cmp(self.elms[cur], self.elms[par]) < 0:
swap(self.elms[cur], self.elms[par])
(cur, par) = (par, parent(par))
proc downHeap[T](self: var PrirorityQueue[T], cur: var int) =
var (chl, chr) = (childl(cur), childr(cur))
while chl < self.elms.len:
var ch =
if chr >= self.elms.len or self.cmp(self.elms[chl], self.elms[chr]) < 0: chl
else: chr
if self.cmp(self.elms[cur], self.elms[ch]) < 0:
break
swap(self.elms[cur], self.elms[ch])
(cur, chl, chr) = (ch, childl(cur), childr(cur))
proc len*[T](self: PrirorityQueue[T]): int =
self.elms.len
proc peek*[T](self: var PrirorityQueue[T]): T =
self.elms[0]
proc push*[T](self: var PrirorityQueue[T], data: T) =
var
n = self.elms.len
cur = n
self.elms.setLen(n + 1)
self.elms[cur] = data
self.upHeap(cur)
proc pop*[T](self: var PrirorityQueue[T]): T =
assert self.elms.len > 0
var
n = self.elms.len
cur = 0
result = self.elms[0]
self.elms[cur] = self.elms[n-1]
self.elms.del(n-1)
self.downHeap(cur)
proc delete*[T](self: var PrirorityQueue[T], data: T): bool =
var
n = self.elms.len
idx = -1
for i in 0..<n:
if self.elms[i] == data:
idx = i
break
if idx == -1:
return false
elif idx == n - 1:
self.elms.del(idx)
else:
self.elms[idx] = self.elms[n-1]
self.elms.del(n-1)
self.downHeap(idx)
self.upHeap(idx)
return true
# ==============================================================================
when isMainModule:
var
n = stdin.readLine.parseInt
a = stdin.readLine.split.map(parseInt)
b = newSeq[int](n)
lastIdx = newTable[int, int]()
pQ = newPriorityQueue[int]((x: int, y: int) => y - x)
for i in 0..<n:
lastIdx[a[i]] = i
for i in 0..<n:
pQ.push(a[i])
b[i] = pQ.peek()
if i == lastIdx[a[i]]:
while pQ.delete(a[i]):
discard
echo b.join(" ")
t8m8⛄️