結果

問題 No.778 クリスマスツリー
ユーザー ikd
提出日時 2018-12-25 13:52:42
言語 Nim
(2.2.0)
結果
AC  
実行時間 184 ms / 2,000 ms
コード長 1,377 bytes
コンパイル時間 4,435 ms
コンパイル使用メモリ 66,148 KB
実行使用メモリ 57,600 KB
最終ジャッジ日時 2024-10-14 01:53:30
合計ジャッジ時間 6,437 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 12
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import strutils, sequtils, algorithm
type SegmentTree = object
n: int
dat: seq[int]
proc init(sz: int): SegmentTree =
var n = 1
while n<sz: n*=2
var dat = newSeqWith(n*2-1, 0)
result = SegmentTree(n: n, dat: dat)
proc add(this: var SegmentTree, i, x: int) =
var k = i+this.n-1
this.dat[k]+=x
while k>0:
k = (k-1) div 2
this.dat[k] = this.dat[k*2+1]+this.dat[k*2+2]
proc rsum(this: SegmentTree, ql, qr, i, il, ir: int): int =
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 = this.rsum(ql, qr, i*2+1, il, m)+this.rsum(ql, qr, i*2+2, m, ir)
proc f(g: seq[seq[int]], a: var seq[int], i: int) =
a.add(i)
for j in g[i]:
f(g, a, j)
a.add(i)
proc main() =
let
n = stdin.readLine.parseInt
a = stdin.readLine.split.map(parseInt)
var g = newSeqWith(n, newSeq[int]())
for i in 0..<(n-1):
g[a[i]].add(i+1)
var eul = newSeq[int]()
f(g, eul, 0)
var
pos_first = newSeqWith(n, -1)
pos_last = newSeqWith(n, -1)
for i, v in eul:
if pos_first[v]<0:
pos_first[v] = i
for i, v in reversed(eul):
if pos_last[v]<0:
pos_last[v] = eul.len-i
var
tree = init(eul.len)
ans = 0'i64
for i in 1..n:
ans+=tree.rsum(pos_first[n-i], pos_last[n-i], 0, 0, tree.n)
tree.add(pos_first[n-i], 1)
echo ans
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0