結果
| 問題 |
No.778 クリスマスツリー
|
| コンテスト | |
| ユーザー |
htkb
|
| 提出日時 | 2019-01-06 15:32:14 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 1,831 ms / 2,000 ms |
| コード長 | 1,579 bytes |
| コンパイル時間 | 188 ms |
| コンパイル使用メモリ | 12,800 KB |
| 実行使用メモリ | 76,740 KB |
| 最終ジャッジ日時 | 2024-11-23 23:49:50 |
| 合計ジャッジ時間 | 15,994 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
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):
from collections import deque
tree_size, euler_tour_size = len(tree), len(tree)*2-1
edges = [[] for _ in [0]*tree_size]
for origin, destination in enumerate(tree):
if destination >= 0:
edges[destination].append(origin)
subtree_range = [[0, 0] for _ in [0]*tree_size]
dq, index = deque([0]), 0
pop, extend = dq.pop, dq.extend
while index < euler_tour_size:
index, v = index+1, pop()
if not subtree_range[v][0]:
subtree_range[v][0] = index
else:
subtree_range[v][1] = index
continue
dq.append(tree[v])
if edges[v]:
dq.extend(edges[v])
else:
subtree_range[v][1] = index
return subtree_range
if __name__ == "__main__":
N = int(input())
tree = [-1] + 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)
htkb