結果
| 問題 | No.3 ビットすごろく | 
| コンテスト | |
| ユーザー |  n_knuu | 
| 提出日時 | 2017-01-04 20:05:13 | 
| 言語 | Nim (2.2.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 3 ms / 5,000 ms | 
| コード長 | 1,969 bytes | 
| コンパイル時間 | 4,353 ms | 
| コンパイル使用メモリ | 66,172 KB | 
| 実行使用メモリ | 6,944 KB | 
| 最終ジャッジ日時 | 2024-07-01 08:16:25 | 
| 合計ジャッジ時間 | 5,265 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 33 | 
コンパイルメッセージ
/home/judge/data/code/Main.nim(7, 20) Warning: inherit from a more precise exception type like ValueError, IOError or OSError. If these don't suit, inherit from CatchableError or Defect. [InheritFromException]
ソースコード
import strutils, sequtils
type
  Heap[T]= object
    data: seq[T]
    size: int
    comp: proc (x: T, y: T): int
  EmptyHeapError = object of Exception
proc siftup[T](h: var Heap[T]) =
  var i = h.size - 1
  while i > 0:
    var par = (i-1) div 2
    if h.comp(h.data[par], h.data[i]) > 0:
      swap(h.data[i], h.data[par])
      i = par
    else:
      break
proc siftdown[T](h: var Heap[T]) =
  var par = 0
  while par < h.size:
    let (left, right) = (2*par+1, 2*par+2)
    if right < h.size:
      if h.comp(h.data[par], min(h.data[left], h.data[right])) <= 0:
        break
      elif h.comp(h.data[left], h.data[right]) < 0:
        swap(h.data[par], h.data[left])
        par = left
      else:
        swap(h.data[par], h.data[right])
        par = right
    elif left < h.size:
      if h.comp(h.data[left], h.data[par]) < 0:
        swap(h.data[par], h.data[left])
        par = left
      else:
        break
    else:
      break
proc initHeap[T](comparator: proc (x: T, y: T): int = cmp): Heap[T] =
  Heap[T](data: newSeq[T](), size: 0, comp: comparator)
proc push[T](h: var Heap[T], x: T) =
  h.data.add(x)
  h.size.inc
  h.siftup
proc pop[T](h: var Heap[T]): T =
  if h.size <= 0:
    raise newException(EmptyHeapError, "cannot pop element, heap is empty")
  result = h.data[0]
  h.data[0] = h.data[^1]
  h.size.dec
  h.data.setlen(h.size)
  h.siftdown
proc empty[T](h: var Heap[T]): bool {. inline .} = h.data.len == 0
proc popcount(x: int): cint {.
  importc: "__builtin_popcount", nodecl, nosideeffect.}
let N = stdin.readline.parseInt
var
  dist = newSeqWith(N+1, 1e9.int)
  pque = initHeap[(int, int)]()
pque.push((1, 1))
while not pque.empty:
  let (c, v) = pque.pop
  if dist[v] <= c:
    continue
  dist[v] = c
  if v == N:
    echo(c)
    quit()
  let pcnt = popcount(v)
  for sgn in @[-1, 1]:
    if 0 < v + sgn * pcnt and v + sgn * pcnt <= N and dist[v] + 1 < dist[v + sgn * pcnt]:
      pque.push((dist[v] + 1, v + sgn * pcnt))
echo(-1)
            
            
            
        