結果
| 問題 | 
                            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