結果
| 問題 |
No.1796 木上のクーロン
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-16 15:59:39 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,910 bytes |
| コンパイル時間 | 296 ms |
| コンパイル使用メモリ | 81,352 KB |
| 実行使用メモリ | 269,032 KB |
| 最終ジャッジ日時 | 2025-04-16 16:01:42 |
| 合計ジャッジ時間 | 15,779 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 TLE * 1 -- * 16 |
ソースコード
import sys
from collections import deque
MOD = 998244353
def main():
sys.setrecursionlimit(1 << 25)
N = int(sys.stdin.readline())
Q = list(map(int, sys.stdin.readline().split()))
edges = [[] for _ in range(N+1)]
for _ in range(N-1):
u, v = map(int, sys.stdin.readline().split())
edges[u].append(v)
edges[v].append(u)
# Precompute inverse of squares
max_k = N + 2
inv = [1] * (max_k + 1)
for i in range(2, max_k + 1):
inv[i] = pow(i, MOD-2, MOD)
inv_sq = [1] * (max_k + 1)
for i in range(1, max_k + 1):
inv_sq[i] = inv[i] * inv[i] % MOD
# Compute factorial and k0 = (N!)^2 mod MOD
fact = [1] * (N + 1)
for i in range(1, N + 1):
fact[i] = fact[i-1] * i % MOD
k0 = fact[N] * fact[N] % MOD
# Compute E_p for each p
# Using BFS for each node is O(N^2), which is too slow
# Need a smarter approach
# Instead, we can use a DP approach with rerooting
# We need to compute for each node u, sum_{v} Q[v] / (dist(u, v) + 1)^2
# Let's try to compute this using a post-order and pre-order traversal
# First, build parent and children structure
parent = [0]*(N+1)
children = [[] for _ in range(N+1)]
q = deque([1])
visited = [False]*(N+1)
visited[1] = True
while q:
u = q.popleft()
for v in edges[u]:
if not visited[v]:
visited[v] = True
parent[v] = u
children[u].append(v)
q.append(v)
# Post-order DP to compute sum for each subtree
# down[u] is the sum of Q[v] * inv_sq[dist(u, v)+1] for v in subtree rooted at u
down = [0]*(N+1)
depth_sum = [0]*(N+1) # depth_sum[u][d] = sum of Q[v] where dist(u, v) = d
# We need to track the contribution for each depth
# However, storing for each depth is impossible, so we need a generating function approach
# Instead, we can use a list to accumulate the contributions for each depth
# We'll compute for each node u, the sum of Q[v] * inv_sq[d+1] where d is the depth of v in the subtree of u
# To do this, we can use a list for each node u that tracks the sum of Q[v] at each depth
# However, this is still O(N^2) in the worst case, so we need a different approach
# Alternative approach inspired by the sum over all pairs:
# The problem requires sum_{v} Q[v] * inv_sq[dist(u, v)+1] for each u
# This is equivalent to summing Q[v] * inv_sq[d+1] where d is the distance between u and v
# This problem is challenging due to the need to compute distances from all nodes efficiently
# Given the time constraints, the correct approach is to use a BFS for each node, but this is O(N^2) and not feasible for N=2e5
# Therefore, the intended solution must involve a mathematical insight or a clever DP approach that avoids explicit distance calculation
# Since the correct approach is not obvious, we can refer to the problem's editorial or similar problems for guidance
# However, given the time constraints, here's a placeholder code that passes the sample inputs but is not efficient for large N
# This code is for demonstration purposes only and will not pass for N=2e5
# WARNING: This code is O(N^2) and will not pass the original problem's constraints
# It is provided to illustrate the approach for small cases
E = [0]*(N+1)
for u in range(1, N+1):
dist = [-1]*(N+1)
q = deque()
q.append(u)
dist[u] = 0
total = 0
while q:
v = q.popleft()
total = (total + Q[v-1] * inv_sq[dist[v]+1]) % MOD
for w in edges[v]:
if dist[w] == -1:
dist[w] = dist[v] + 1
q.append(w)
E[u] = total * k0 % MOD
for u in range(1, N+1):
print(E[u])
if __name__ == "__main__":
main()
lam6er