結果

問題 No.777 再帰的ケーキ
ユーザー ikdikd
提出日時 2018-12-24 10:26:10
言語 Nim
(2.0.2)
結果
AC  
実行時間 753 ms / 2,000 ms
コード長 1,340 bytes
コンパイル時間 4,069 ms
コンパイル使用メモリ 73,380 KB
実行使用メモリ 37,420 KB
最終ジャッジ日時 2024-07-01 06:13:49
合計ジャッジ時間 9,844 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,812 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 1 ms
6,944 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 1 ms
6,944 KB
testcase_05 AC 1 ms
6,940 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 1 ms
6,940 KB
testcase_08 AC 2 ms
6,940 KB
testcase_09 AC 2 ms
6,944 KB
testcase_10 AC 2 ms
6,940 KB
testcase_11 AC 1 ms
6,944 KB
testcase_12 AC 2 ms
6,944 KB
testcase_13 AC 1 ms
6,944 KB
testcase_14 AC 1 ms
6,940 KB
testcase_15 AC 2 ms
6,944 KB
testcase_16 AC 1 ms
6,944 KB
testcase_17 AC 2 ms
6,940 KB
testcase_18 AC 2 ms
6,940 KB
testcase_19 AC 2 ms
6,944 KB
testcase_20 AC 2 ms
6,944 KB
testcase_21 AC 5 ms
6,940 KB
testcase_22 AC 6 ms
6,940 KB
testcase_23 AC 3 ms
6,940 KB
testcase_24 AC 3 ms
6,944 KB
testcase_25 AC 6 ms
6,944 KB
testcase_26 AC 6 ms
6,940 KB
testcase_27 AC 3 ms
6,944 KB
testcase_28 AC 753 ms
37,148 KB
testcase_29 AC 680 ms
37,420 KB
testcase_30 AC 698 ms
37,156 KB
testcase_31 AC 695 ms
37,244 KB
testcase_32 AC 365 ms
37,104 KB
testcase_33 AC 120 ms
10,240 KB
testcase_34 AC 171 ms
14,084 KB
testcase_35 AC 606 ms
24,900 KB
testcase_36 AC 428 ms
37,304 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import strutils, sequtils, algorithm, tables

type SegmentTree = object
  n: int
  dat: seq[int64]
proc init(sz: int): SegmentTree =
  var n = 1
  while n<sz: n*=2
  var dat = newSeqWith(n*2-1, 0'i64)
  result = SegmentTree(n: n, dat: dat)
proc update(this: var SegmentTree, i: int, x: int64) =
  var k = i+this.n-1
  if this.dat[k]<x:
    this.dat[k] = x
    while k>0:
      k = (k-1) div 2
      this.dat[k] = max(this.dat[k*2+1], this.dat[k*2+2])
proc rmax(this: SegmentTree, ql, qr, i, il, ir: int): int64 =
  if qr<=il or ir<=ql:
    result = 0
  elif ql<=il and ir<=qr:
    result = this.dat[i]
  else:
    let m = (il+ir) div 2
    result = max(
      this.rmax(ql, qr, i*2+1, il, m), this.rmax(ql, qr, i*2+2, m, ir))

proc main() =
  let n = stdin.readLine.parseInt
  var abcs = (0..<n).mapIt(stdin.readLine.split.map(parseInt))
  abcs.sort(proc(x, y: seq[int]): int = cmp(x[1], y[1]))
  var map = newTable[int64, int]()
  for abc in abcs:
    if not map.hasKey(abc[1]):
      map[abc[1]] = map.len
  abcs.sort do (x, y: seq[int])->int:
    result = cmp(y[0], x[0])
    if result==0:
      result = cmp(x[1], y[1])
  let m = map.len
  var
    tree = init(m)
    ans = 0'i64
  for i, abc in abcs:
    let s = tree.rmax(map[abc[1]]+1, m, 0, 0, tree.n) + abc[2]
    ans = max(ans, s)
    tree.update(map[abc[1]], s)
  echo ans
main()
0