結果

問題 No.3343 Distance Sum of Large Tree
コンテスト
ユーザー tassei903
提出日時 2025-10-25 16:26:27
言語 PyPy3
(7.3.15)
結果
WA  
(最新)
AC  
(最初)
実行時間 -
コード長 1,106 bytes
コンパイル時間 178 ms
コンパイル使用メモリ 82,484 KB
実行使用メモリ 110,568 KB
最終ジャッジ日時 2025-11-13 20:53:38
合計ジャッジ時間 6,949 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 2
other WA * 30
権限があれば一括ダウンロードができます

ソースコード

diff #


mod = 998244353

def solve(n, a, b, c, p):
    """
    まず、パスとパスをつなぐ辺は、頂点にA_i の重みがあるとして、
    sub[v] * (M - sub[v])の総和を求めればいい
    """
    M = sum(a)
    ans = 0

    sub = [a[i] for i in range(n)]
    for i in range(n-1, 0, -1):
        sub[p[i]] += sub[i]
    f = [[] for i in range(n)]
    for i in range(1, n):
        f[p[i]].append((c[i], sub[i]))
        f[i].append((b[i], M - sub[i]))
        ans += sub[i] * (M - sub[i])
    
    
    for i in range(n):
        last = 0
        f[i].append((a[i]-1, 0))
        f[i].sort()
        A = 1
        for x, r in f[i]:
            y = x - last
            ans += A * (M - A) % mod * y - y * (y - 1) * (y * 2 - 1) // 6 + (M - A * 2) % mod * y * (y - 1) // 2
            ans %= mod
            A += r + y
            last = x
    return ans % mod

n = int(input())
a = list(map(int, input().split()))
b = [-1] + [int(x) - 1 for x in input().split()]
c = [-1] + [int(x) - 1 for x in input().split()]
p = [-1] + [int(x) - 1 for x in input().split()]


print(solve(n, a, b, c, p))
0