結果
| 問題 |
No.778 クリスマスツリー
|
| コンテスト | |
| ユーザー |
silversmith
|
| 提出日時 | 2019-05-03 18:13:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 482 ms / 2,000 ms |
| コード長 | 1,956 bytes |
| コンパイル時間 | 165 ms |
| コンパイル使用メモリ | 82,080 KB |
| 実行使用メモリ | 140,532 KB |
| 最終ジャッジ日時 | 2024-10-14 01:59:07 |
| 合計ジャッジ時間 | 4,609 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#import sys
#sys.setrecursionlimit(1000)
import queue
class bit_tree:
def __init__(self, num):
self.size = num
self.list = [0] * (num + 1)
def sum(self, i):
s = 0
while i > 0:
s += self.list[i]
i -= i & -i
return s
def add(self, i, x):
while i <= self.size:
self.list[i] += x
i += i & -i
class Node:
def __init__(self):
#self.parent_Node = None
self.child_Node = []
self.visited_cnt = 0
self.dns = 0
self.child_Node_visited_idx = -1
class tree:
def __init__(self, Nodes):
self.Nodes = Nodes
self.bit_tree = bit_tree(len(Nodes))
def push_edge(self,low, upper):
self.Nodes[upper].child_Node.append(low)
#@profile
def dns(self, val):
stack = []
stack.append(val)
#self.sorted_list.insert(val)
while len(stack) > 0:
v = stack.pop()
self.Nodes[v].visited_cnt += 1
if len(self.Nodes[v].child_Node) == 0:
self.Nodes[v].dns = self.bit_tree.sum(v+1)
elif self.Nodes[v].visited_cnt == len(self.Nodes[v].child_Node) + 1:
self.bit_tree.add(v+1, -1)
self.Nodes[v].dns = self.bit_tree.sum(v+1)
self.Nodes[v].dns += sum([self.Nodes[node].dns for node in self.Nodes[v].child_Node])
else:
stack.append(v)
stack.append(self.Nodes[v].child_Node[self.Nodes[v].child_Node_visited_idx +1])
if self.Nodes[v].child_Node_visited_idx == -1:
self.bit_tree.add(v+1, 1)
self.Nodes[v].child_Node_visited_idx += 1
return self.Nodes[val].dns
N = int(input())
A = map(int, input().split())
t = tree([Node() for i in range(N)])
for idx, a in enumerate(A):
t.push_edge(idx + 1, a)
A = None
N = None
print(t.dns(0))
silversmith