結果
| 問題 |
No.778 クリスマスツリー
|
| コンテスト | |
| ユーザー |
htkb
|
| 提出日時 | 2019-01-06 14:40:00 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,439 bytes |
| コンパイル時間 | 269 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 113,528 KB |
| 最終ジャッジ日時 | 2024-11-23 23:47:50 |
| 合計ジャッジ時間 | 19,664 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 7 TLE * 5 |
ソースコード
class BinaryIndexedTree(object):
__slots__ = ["tree"]
def __init__(self, size: int):
self.tree = [0]*(size+1)
def add(self, index: int, value: int):
tree = self.tree
while index < len(tree):
tree[index] += value
index += index & -index
def sum(self, index: int):
tree, result = self.tree, 0
while index:
result += tree[index]
index -= index & -index
return result
def euler_tour(tree):
import sys
sys.setrecursionlimit(10**7)
edges = [[] for _ in [0]*(len(tree)+1)]
for origin, destination in enumerate(tree, start=1):
edges[destination].append(origin)
subtree_range = [[0, 0] for _ in [0]*(len(tree)+1)]
def rec(v, index):
subtree_range[v][0] = index
for destination in edges[v]:
index = rec(destination, index+1)
subtree_range[v][1] = index
return index + 1
rec(0, 1)
return subtree_range
def solve():
N = int(input())
tree = list(map(int, input().split()))
subtree_range = euler_tour(tree)
bit = BinaryIndexedTree(2*N-1)
ans = 0
for start, end in subtree_range[::-1]:
ans += bit.sum(end) - bit.sum(start-1)
bit.add(start, 1)
print(ans)
if __name__ == "__main__":
import threading
threading.stack_size(10**9)
thread = threading.Thread(target=solve)
thread.start()
htkb