結果
問題 | No.778 クリスマスツリー |
ユーザー |
|
提出日時 | 2022-03-31 14:40:49 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,669 ms / 2,000 ms |
コード長 | 5,662 bytes |
コンパイル時間 | 208 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 436,688 KB |
最終ジャッジ日時 | 2024-11-16 21:57:07 |
合計ジャッジ時間 | 12,588 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 |
ソースコード
#!/usr/bin/python# -*- coding: utf-8 -*-# importfrom sys import stdin, setrecursionlimitsetrecursionlimit(10**8)# defdef int_map():return map(int,input().split())def int_list():return ['Null']+list(map(int,input().split()))# 整数のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)def int_mtx(N):x = [['Null']+list(map(int, stdin.readline().split())) for _ in range(N)]x.insert(0,['Null'])return x# 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)# AAAAA# BBBBB# CCCCC# のような標準入力を# '0AAAAA'# '0BBBBB'# '0CCCCC'# と受け取るdef str_mtx(N):x = ['0'+stdin.readline()[:-1] for _ in range(N)]x.insert(0,'0')return x# 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)# AAAAA XXXXX# BBBBB YYYYY# CCCCC ZZZZZ# のような標準入力を# [[['0'],[AAAAA],[XXXXX]],# [['0'],[BBBBB],[YYYYY]],# [['0'],[CCCCC],[ZZZZZ]] ]# と受け取るdef str_list(N):x = [['0']+list(map(str, stdin.readline().split())) for _ in range(N)]x.insert(0,['0'])return x# 高さH+1, 幅W+1, のゼロ行列の作成def zero_mtx(H,W):x = [[0]*(W+1) for i in range(H+1)]return x# リストをスペースで分割する(先頭を省く)def print_space(l):return print(" ".join([str(x) for x in l[1:]]))# ゼロインデックスの場合# 整数のリストのリスト:N行のリスト(各行のリストは同じ長さでなくてよい.)def int_mtx_0(N):x = [list(map(int, stdin.readline().split())) for _ in range(N)]return x# ゼロインデックスの場合# 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)def str_mtx_0(N):x = [list(stdin.readline()[:-1]) for _ in range(N)]return x# ゼロインデックスの場合# リストをスペースで分割する(先頭を省かない)def print_space_0(l):return print(" ".join([str(x) for x in l]))# ゼロインデックスの場合# 高さH, 幅W, のゼロ行列の作成def zero_mtx_0(H,W):x = [[0]*W for i in range(H)]return xdef int_list_0():return list(map(int,input().split()))## インポート# from collections import deque# 順列に使う# import itertools# 最大公約数などに使う# import math# リストの要素の数をdict形式で# import collections# 二次元配列のコピーを作りたいとき# a_copy = deepcopy(a)# from copy import deepcopyfrom collections import deque, defaultdict# 絶対に有効化するimport pypyjitpypyjit.set_param('max_unroll_recursion=-1')N = int(input())# UV については無向辺のつもりで書けば良いcccc = int_list_0()UV = []for i in range(N-1):UV.append([i+1,cccc[i]])root_id = 0G = [[] for _ in range(N)]for ui,vi in UV:G[ui].append(vi)G[vi].append(ui)# Euler Tour TechniqueS = []AS = defaultdict(list)def dfs(v, p, d):AS[v].append(len(S))S.append(v)for w in G[v]:if w == p:continuedfs(w, v, d+1)AS[v].append(len(S))S.append(v)dfs(root_id, -1, 0)class SegTree:def __init__(self, A, SegType):if SegType == "min":self.X_f = minself.X_unit = float('inf')elif SegType == "max":self.X_f = maxself.X_unit = -float('inf')elif SegType == "sum":def segfunc(x, y):return x+yself.X_f = segfuncself.X_unit = 0elif SegType == "pro":def segfunc(x, y):return x*yself.X_f = segfuncself.X_unit = 1elif SegType == "xor":def segfunc(x, y):return x^yself.X_f = segfuncself.X_unit = 0elif SegType == "gcd":from math import gcdself.X_f = gcdself.X_unit = 0elif SegType == "lcm":from math import gcddef lcm(a,b):return a//gcd(a,b)*bself.X_f = lcmself.X_unit = 1self.N = len(A)self.X = [self.X_unit] * (self.N + self.N)self.build(A)def leaf(self):return self.X[self.N:]def build(self, seq):for i, x in enumerate(seq, self.N):self.X[i] = xfor i in range(self.N - 1, 0, -1):self.X[i] = self.X_f(self.X[i << 1], self.X[i << 1 | 1])def set_val(self, i, x):i += self.Nself.X[i] = xwhile i > 1:i >>= 1self.X[i] = self.X_f(self.X[i << 1], self.X[i << 1 | 1])def add_val(self, i, x):i += self.Nself.X[i] += xwhile i > 1:i >>= 1self.X[i] = self.X_f(self.X[i << 1], self.X[i << 1 | 1])def fold(self, L, R):L += self.NR += self.NvL = self.X_unitvR = self.X_unitwhile L < R:if L & 1:vL = self.X_f(vL, self.X[L])L += 1if R & 1:R -= 1vR = self.X_f(self.X[R], vR)L >>= 1R >>= 1return self.X_f(vL, vR)A = [0]*len(S)SegType = "sum"seg = SegTree(A, SegType)ans = 0for i in reversed(range(N)):l = AS[i][0]r = AS[i][-1]ans += seg.fold(l,r+1)seg.set_val(AS[i][0],1)print(ans)