/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 36ms 17.246 MiB
#2 Accepted 241ms 23.301 MiB
#3 Accepted 249ms 24.086 MiB
#4 Accepted 117ms 21.906 MiB
#5 Accepted 258ms 23.82 MiB
#6 Accepted 505ms 45.703 MiB
#7 Accepted 435ms 43.793 MiB
#8 Accepted 476ms 44.227 MiB
#9 Accepted 556ms 46.105 MiB
#10 Accepted 196ms 61.965 MiB
#11 Accepted 196ms 61.281 MiB
#12 Accepted 317ms 71.293 MiB
#13 Accepted 327ms 66.207 MiB
#14 Accepted 683ms 107.742 MiB
#15 Accepted 799ms 106.504 MiB
#16 Accepted 564ms 44.188 MiB

Code

# ruff: noqa: E731, E741
from heapq import nlargest
import math
import sys

read = sys.stdin.readline
input = lambda: read().rstrip()
ir = lambda: int(read())
rir = lambda: range(int(read()))
mir = lambda: map(int, read().split())
lmir = lambda: list(map(int, read().split()))


def solve():
    n = ir()
    values = lmir()
    tree = [dict() for _ in range(n)]
    for _ in range(n - 1):
        u, v, w = mir()
        tree[u - 1][v - 1] = w
        tree[v - 1][u - 1] = w

    parents = [None] * n
    depth = [-1] * n
    depth[0] = 0
    q = [0]
    for i in q:
        for j in tree[i]:
            if depth[j] == -1:
                parents[j] = i
                depth[j] = depth[i] + 1
                q.append(j)

    branch_scores = [-math.inf] * n
    branch_scores_no_self = [-math.inf] * n
    full_scores = [-math.inf] * n
    for i in reversed(q):
        best_branch_score = -math.inf
        best_branch_score_no_self = -math.inf
        child_scores = []
        for j, w in tree[i].items():
            if j == parents[i]:
                continue
            best_branch_score = max(
                best_branch_score,
                branch_scores[j] + values[i] - 2 * w,
            )
            best_branch_score_no_self = max(
                best_branch_score_no_self,
                branch_scores_no_self[j] + values[i] - 2 * w,
            )
            child_scores.append(branch_scores[j] - 2 * w)
        full_scores[i] = best_branch_score_no_self
        if len(child_scores) >= 2:
            c1, c2 = nlargest(2, child_scores)
            full_scores[i] = max(full_scores[i], values[i] + c1 + c2)
        branch_scores_no_self[i] = best_branch_score
        branch_scores[i] = (
            values[i]
            if best_branch_score is None
            else max(best_branch_score, values[i])
        )

    # print(branch_scores)
    # print(full_scores)
    print(max(full_scores))
    # print(values)


def main():
    for _ in rir():
        solve()


def test():
    pass


if __name__ == "__main__":
    if sys.stdin.isatty():
        test()
    else:
        main()

Information

Submit By
Type
Submission
Problem
P1205 E. Make Cycle in Tree
Contest
Educational Round 1
Language
PyPy 3 (Python 3.9.18 PyPy 7.3.15)
Submit At
2025-07-14 17:47:40
Judged At
2025-07-14 17:47:40
Judged By
Score
100
Total Time
799ms
Peak Memory
107.742 MiB